MariaDB 单机及集群部署
一、Linux单机部署
1. 添加MariaDB的yum文件MariaDB.repo;
2. 添加MariaDB.repo仓库配置;
[mariadb] name=MariaDB baseurl=https://mirrors.aliyun.com/mariadb/yum/10.4/centos7-amd64/ gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1
3. 安装MariaDB:yum install -y mariadb-server,若卸载执行yum autoremove mariadb;
4. 启动MariaDB服务:systemctl start mariadb,并设为开机自启;
# 设置开机启动 systemctl enable mariadb # 启动服务 systemctl start mariadb # 重新启动 systemctl restart mariadb # 停止 systemctl stop mariadb
5. 登录数据库:mysql -u root -p,root账号密码为空,直接回车即可;
6. 初始化MariaDB配置:mysql_secure_installation;
7. 重启MariaDB:systemctl restart mariadb;
8. 授予外网登陆权限:grant all privileges on *.* to root@'%' identified by 'root'。
设置密码:ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("123456")
二、Linux Galera集群介绍及部署
简介:Galera Cluster是免费开源的Mariadb数据库高可用方案,新版本Mariadb自带Galera,其本身具有multi-master特性,支持多点写入,Galera Cluster的三个及以上节点是对等关系,每个节点均支持写入,集群内部会保证写入数据的一致性与完整性,Galera集群是基于wsrep协议工作的。
1. Galera Cluster特性
优点:
A. 同步复制(几乎),没有复制延迟;
B. 双活多主拓扑,任意集群节点可以同时读写数据库,无需读写分离;
C. 自动成员控制,故障节点从集群中删除,自动节点加入,无需手动拷贝数据;
D. 真正的并行复制,在行级别体现;
E. 读取可扩展性强;
缺点:
A. 节点上数据重复,新加入节点需要复制完整数据导致开销大;
B. 事务提交需要跨节点通信,因此分布式事务操作时写入会比主从复制慢;
C. 对于两个节点集群,如果网络出现波动不稳定,则可能集群会发生脑裂,导致服务不可用,因此建议最少3个节点(需奇数);
2. Galera对比MySQL的局限性
A. 目前复制仅支持InnoDB存储引擎;
B. 所有表都应该都一个主键,因为DELETE操作需要;
C. 不支持XA事务及部分显示锁;
3. 搭建集群环境
A. 环境准备:OS版本 CentOS7.4,三台虚拟机;
B. 防火墙设置:关闭防火墙 systemctl stop firewalld,或者防火墙开发以下端口;
4567是Galera做数据复制的通讯和数据传输端口,需要在防火墙放开TCP和UDP
4568是Galera做增量数据传输使用的端口(Incremental State Transfer, IST),需要防火墙放开TCP
4444是Galera做快照状态传输使用的端口(State Snapshot Transfer, SST),需要防火墙放开TCP;
C. 关闭selinux:vi /etc/selinux/config,设置SELINUX=disabled;
D. 修改文件描述符
E. 配置hosts文件:vi /etc/hosts
192.168.10.101 rhxy-db1
192.168.10.102 rhxy-db2
192.168.10.103 rhxy-db3
F. 下载安装mariadb:yum 安装时文件默认放在var/lib/mysql中,若要指定datadir目录需要将文件拷贝过去
yum remove mariadb
yum install -y MariaDB-server rsync
G. 修改配置文件:vi /etc/my.cnf.d/server.cnf
# # These groups are read by MariaDB server. # Use it for options that only the server (but not clients) should see # # See the examples of server my.cnf files in /usr/share/mysql/ # # this is read by the standalone daemon and embedded servers [server] # this is only for the mysqld standalone daemon [mysqld] skip-name-resolve character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET collation_connection = utf8mb4_unicode_ci' init_connect='SET NAMES utf8mb4' skip-character-set-client-handshake=true skip-external-locking #skip-grant-tables #**#开启性能监控 performance_schema=ON #**#暂存的连接数量 back_log=128 max_connections=1256 interactive_timeout = 120 wait_timeout = 120 # Connection and Thread variables port = 3306 # default 3306 #socket = /data/mysql/data/mysql.sock # Use mysqld.sock on Ubuntu, conflicts with AppArmor otherwise # basedir = %BASEDIR% datadir =/data/mysql/data # tmpdir = '%INSTANCEDIR%/tmp' # innodb_tmpdir = '%INSTANCEDIR%/tmp' # MySQL 5.7 # MySQL error log log_error = /data/mysql/logs/master_error.log # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld # log_timestamps = SYSTEM # MySQL 5.7, equivalent to old behaviour log_warnings = 2 # MySQL 5.6, equivalent to log_error_verbosity = 3 # log_error_verbosity = 3 # MySQL 5.7, equivalent to log_warnings = 2, MariaDB does NOT support this! innodb_print_all_deadlocks = 1 # wsrep_log_conflicts = 1 # for Galera only! general_log=ON general_log_file =/data/mysql/logs/master_general.log # Slow Query Log slow_query_log_file = /data/mysql/logs/master_slow.log # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld slow_query_log = 0 log_queries_not_using_indexes = 0 # Interesting on developer systems! long_query_time = 1 min_examined_row_limit = 100 # InnoDB variables innodb_strict_mode = ON # innodb_file_format_check = 1 # Desupported in MySQL 8.0 # innodb_file_format = Barracuda # For dynamic and compressed InnoDB tables, default in 5.7 innodb_buffer_pool_size = 2G # Go up to 80% of your available RAM innodb_buffer_pool_instances = 8 # Bigger if huge InnoDB Buffer Pool or high concurrency innodb_file_per_table = 1 # Is the recommended way nowadays # innodb_flush_method = O_DIRECT # O_DIRECT is sometimes better for direct attached storage # innodb_write_io_threads = 8 # If you have a strong I/O system or SSD # innodb_read_io_threads = 8 # If you have a strong I/O system or SSD # innodb_io_capacity = 1000 # If you have a strong I/O system or SSD innodb_flush_log_at_trx_commit = 2 # 1 for durability, 0 or 2 for performance innodb_log_buffer_size = 8M # Bigger if innodb_flush_log_at_trx_commit = 0 innodb_log_file_size = 256M # Bigger means more write throughput but longer recovery time # Since MariaDB 10.0 and MySQL 5.6 innodb_monitor_enable = all # # * Galera-related settings # [galera] # Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so wsrep_cluster_address="gcomm://192.168.10.101,192.168.10.102,192.168.10.103" wsrep_node_name=rhxy-db1 wsrep_node_address=192.168.10.101 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 # # Allow server to accept connections on all interfaces. # bind-address=0.0.0.0 # # Optional setting wsrep_cluster_name=MariaDB-Galera-Cluster wsrep_slave_threads=4 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=2G wsrep_sst_method=rsync wsrep_causal_reads=OFF # this is only for embedded server [embedded] [mariadb] [mariadb-10.4]
注意其余节点只需要改wsrep_node_name和wsrep_node_address参数值;
H. 集群启动
第一个节点:galera_new_cluster,systemctl enable mariadb;
其余节点:systemctl start mariadb,systemctl enable mariadb;
I. 常用命令
集群状态监控:show global status like 'wsrep_%';
查看集群节点数:show status like 'wsrep_cluster_size';
查看集群同步状态:show status like 'wsrep_local_state_comment';
J. 验证数据同步
4. Gelera配置参数
A. wsrep_on:是否启用wsrep复制,默认值为OFF,如果要加入集群,需要开启设置为ON;
B. wsrep_provider:wsrep库的位置,
C. wsrep_cluster_address:启动时要连接集群节点的地址;
D. wsrep_cluster_name:集群的名称,同一集群中所有节点的值都相等;
E. wsrep_node_name:节点的名称;
F. wsrep_node_address:节点的网络地址,默认端口4567;
G. wsrep_sst_method:用于进行状态快照传输的方式,默认值rsync;
H. wsrep_slave_threads:用于并行应用Gelera写的副本线程数,默认值1;
I. wsrep_causal_reads:是否在集群中强制执行读提交特性,默认值OFF;
J. wsrep_start_position:节点应使用的起始位置;
K. wsrep_recover:默认值为OFF,若设置为ON,在服务器启动时,服务会恢复Galera最近申请的写集的序号,服务将退出;
5. 常见问题
问题一
现象:[ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Conn;
原因:发生集群脑裂
解决方案:删除所有节点的两个缓存文件及/var/lock/subsys目录下的mysql 文件,然后重新启动
A. 删除mysql文件:rm -rf /var/lock/subsys/mysql;
B. 删除缓存文件:rm -rf /var/lib/mysql/galera.cache /var/lib/mysql/grastate.dat;
C. 第一个节点执行:systemctl start mariadb --wsrep-new-cluster;
D. 其余节点执行:systemctl start mariadb;
问题二
现象:执行如下命令,报错
原因:systemd 允许创建同一服务的多个实例,而不是传递命令行参数;
解决方案:
A. 在第一个节点上执行:/usr/bin/mysqld_safe --wsrep-new-cluster,命名在前台执行;
B. 在其他节点上执行:systemctl start mariadb;
C. 待集群完全形成后,通过向第一个节点发送 SIGQUIT(在控制台上按 CTRL + \)来停止第一个节点上的 mariadb,(pkill -SIGQUIT mysqld);
D. 再在第一个节点上执行:systemctl start mariadb;
问题三
现象:虚拟机全部停电,需要重启
解决方案:
A. 每台mariadb机器都需要删掉grastate.dat文件;
B. 重新启动集群 ,在其中一台执行galera_new_cluster,另外几台执行systemctl start mariadb;
问题四:
现象:当数据库启动失败后,清理集群文件,再使用systemctl start mariadb或galera_new_cluster,服务卡住无反应且也不报错;
原因:数据库启动失败后,依然会有wsrep进程,此进程自己不会终止;
解决方案:ps -ef | grep wsrep,查出进程号后kill -9 pid即可,然后再执行启动命令。
可参考:Mariadb问题集绵
三、Linux Docker单机部署
1. 问题一:
现象:docker版mariadb mysql命令进入终端后查询语句无法输入中文;
原因:容器内LANG不支持中文;
解决方案:docker exec -it `docker ps | grep mariadb | awk '{ print $1 }'` env LANG=C.UTF-8 bash
可参考:MariaDB Gelera Cluster官方文档
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2020-06-04 Docker Compose编排、重要参数详解及Portainer监控
2019-06-04 SpringBoot Async异步调用/线程池