《mysql 数据库集群搭建:(一)VirtualBox中多台CentOS虚拟机间和windows主机间互通以及访问互联网设置》
《mysql 数据库集群搭建:(二)3台CentOS-7安装Percona-XtraDB-Cluster-57集群》
《mysql 数据库集群搭建:(三)CentOS 7.2 MariaDB 10.2 galera 集群安装》
《mysql 数据库集群搭建:(四)pacemaker管理三台maxscale集群,搭建mariadb读写分离中间层集群》
本文中的集群都是在VirtualBox中安装的,所以首先需要保证VirtualBox创建的几台服务器能够互通并且在同一网段中,每台虚机能够通过主机互联网安装软件,可以参考我之前些的一片文章《VirtualBox中多台CentOS虚拟机间和windows主机间互通以及访问互联网设置》。
每台服务器安装CentOS 7.2 Minimal 版本,安装后使用yum update更新一下最新的系统内核和相关配置参数。MariaDB galera集群建议最少3台服务器,2台无法保证数据完整性。
几台虚拟机ip设置如下:
节点名称 IP地址
cluster1 192.168.56.21
cluster2 192.168.56.22
cluster3 192.168.56.23
1.删除CentOS自带的老版本mariadb lib文件
1.1查找安装的mariadb
sudo rpm -qa | grep mariadb
1.2删除查找到的lib文件
sudo rpm -e --nodeps (这里是查找到的mariadb lib 文件)
2.因为安装mariadb galera 需要打开 3306、4444、4567、4568四个端口,而且要降低安全审核级别。
2.1 使用以下命令设置防火墙开放这几个端口:
(3306是MariaDB/mysql的服务端口,这个都不开那就不用跑MariaDB/MySQL服务了,需要开TCP端口;
4567是Galera做数据复制的通讯和数据传输端口,需要在防火墙放开TCP和UDP;
4568是Galera做增量数据传输使用的端口(Incremental State Transfer, IST),需要防火墙放开TCP;
4444是Galera做快照状态传输使用的端口(State Snapshot Transfer, SST),需要防火墙放开TCP。)
sudo firewall-cmd --permanent --zone=public --add-port=4567/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4567/udp
(其它几个端口效仿以上命令完成,不需要开udp端口的只设置tcp就可以了)
sudo firewall-cmd --reload (重新加载防火墙使修改生效)
2.2 在CentOS的SELinux配置文件中降低SELinux的安全审核级别,让mysqld可以正常运行,否则SELinux会限制集群数据传输
(setenforce 0 命令只能设置运行时的安全级别,想要完全设置安全级别,需要在SELinux的配置文件中进行配置更改)
2.2.1 使用vi 打开/etc/selinux/config配置文件,设置SELINUX=permissive 或者键入命令 semanage permissive -a mysqld_t
sudo vi /etc/selinux/config
2.2.2 使用reboot命令重启服务器使SELinux安全级别更改生效
3.前往官网获得适合操作系统的最新下载地址并配置yum,官网地址 https://downloads.mariadb.org/
3.1选择最新稳定版本 MariaDB Galera Cluster 10.2 Series 选择 "The MariaDB repository configuration tool is here."中的here点击进入
3.2选择"CentOS"->"CentOS7"->"1.2[stable]"
3.3在系统/etc/yum.repos.d/文件夹下新建 MariaDB.repo文件
sudo vi MariaDB.repo
写入以下源信息
[mariadb]
name = MariaDB
# baseurl = http://yum.mariadb.org/10.2/centos7-amd64 (原有下载地址太慢,需要换成国内的镜像地址)
# gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB(原有下载地址太慢,需要换成国内的镜像地址)
baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64/ (如果版本有变,请根据新的版本修改链接地址)
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
3.4因为从10.1开始galera默认在server中包含,因此安装server和client就可以了
sudo yum install -y MariaDB-server MariaDB-client
4.mariadb默认使用rsync进行节点间数据同步,单rsync同步的时候会锁住节点,没有Percona提供的XtraBackup顺畅,因此这里使用推荐的XtraBackup,需要下载安装
4.1安装Percona XtraBackup 的yum安装源
sudo yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
4.2在yum中查找最新版本进行安装
yum list | grep percona-xtrabackup
4.3启动安装
sudo yum install -y percona-xtrabackup-24
5.安装socat,否则xtrabackup备份同步方式在单节点故障后重启后在.err错误日志中会报类似以下错误
----------------------------------------------------------------------------------
WSREP_SST: [ERROR] socat not found in path: /usr/sbin:/sbin:/usr/local/Percona-XtraDB-Cluster-5.5.34-25.9.607.Linux.i686//bin:/usr/local/xtrabackup/bin:/usr/local/xtrabackup/bin:/usr/local/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:....
-------------------------------------------------------------------------------------
sudo yum install -y socat
6.本文中选择IP为192.168.56.21的虚机作为演示节点进行配置,mariadb安装后默认服务是启动的
6.1 修改root用户默认密码
mysqladmin -u root password "root的登录密码" 或者 mysql_secure_installation (这种方式初学者可能会选错,所以建议用前一种方式)
6.2 本文使用sst_user用户作为集群的数据同步用户,授予所有权限
6.2.1 进入mysql管理命令
mysql -uroot -p
(输入密码)
MariaDB> CREATE USER 'sst_user'@'localhost' IDENTIFIED BY 'sst_user';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO 'sst_user'@'localhost' IDENTIFIED BY 'sst_user'; (如果想让授权的用户不限制IP并且远程访问,在语句最后加WITH GRANT OPTION)
MariaDB> FLUSH PRIVILEGES;
7.关闭mysql服务,为后续配置做准备
systemctl stop mariadb
8.修改配置文件 /etc/my.cnf.d/server.cnf (mariadb的配置文件很多,我安装之后有/etc/my.cnf /etc/my.cnf.d/mysql-clients.cnf /etc/my.cnf.d/server.cnf,其中/etc/my.cnf文件中包含了后两者,/etc/my.cnf.d/mysql-client.cnf中存放客户端连接时的配置信息,例如[client]和[mysql],/etc/my.cnf.d/server.cnf中存放服务器的配置信息,一般只将信息添加到server.cnf就可以了,没必要分那么细,查找配置文件所在位置以及配置信息的命令 mysqld --help --verbose | more,按空格键下翻)
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
datadir = /var/lib/mysql/
pid_file=mariadb.pid
log_error=mariadb.err
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
thread_cache_size = 8
query_cache_size= 16M
character-set-server = utf8
innodb_data_home_dir = /var/lib/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/lib/mysql
innodb_buffer_pool_size = 666M
innodb_log_file_size = 166M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
innodb_flush_log_at_trx_commit=0
bind-address=0.0.0.0
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
default-character-set = utf8
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[galera]
wsrep_on=ON #(决定是否启动节点间同步)
wsrep_provider=/usr/lib64/galera/libgalera_smm.so (galera 的同步c++库位置)
wsrep_cluster_name="wsrep_cluster" #(整个集群的名称,所有节点一致)
wsrep_cluster_address="gcomm://192.168.56.21,192.168.56.22,192.168.56.23" #(集群中所有节点的地址列表,在Percona中第一个启动的节点必须是空值才能启动,MariaDB已无此限制)
wsrep_node_name=cluster1 #(节点名称,其它两个节点需要修改)
wsrep_node_address=192.168.56.21 #(节点地址,其它两个节点需要修改)
wsrep_slave_threads=1
wsrep_certify_nonPK=1
wsrep_max_ws_rows=131072
wsrep_max_ws_size=1073741824
wsrep_debug=0
wsrep_convert_LOCK_to_trx=0
wsrep_retry_autocommit=1
wsrep_auto_increment_control=1
wsrep_drupal_282555_workaround=0
wsrep_causal_reads=0
wsrep_sst_method=xtrabackup-v2 #(使用安装的xtrabackup进行节点间备份同步)
wsrep_sst_auth=sst_user:pswd
xtrabackup方式的备份同步在单节点故障后重启会查找配置文件中的这个文件夹,否则会报类似以下错误
-----------------------------------------------------------------------------------
.err日志文件错误如下:
rm: cannot remove ‘/var/lib/mysql//innobackup.prepare.log’: No such file or directory
rm: cannot remove ‘/var/lib/mysql//innobackup.move.log’: No such file or directory
WSREP_SST: [INFO] Moving the backup to /var/lib/mysql/ (20170725 11:10:34.925)
WSREP_SST: [INFO] Evaluating innobackupex --no-version-check --move-back --force-non-empty-directories ${DATA} &>${DATA}/innobackup.move.log (20170725 11:10:34.928)
WSREP_SST: [ERROR] Cleanup after exit with status:1 (20170725 11:10:34.937)
2017-07-25 11:10:34 140292539795200 [ERROR] WSREP: Process completed with error: wsrep_sst_xtrabackup-v2 --role 'joiner' --address '192.168.56.12' --datadir '/var/lib/mysql/' --parent '3212' '' : 1 (Operation not permitted)
2017-07-25 11:10:34 140292539795200 [ERROR] WSREP: Failed to read uuid:seqno and wsrep_gtid_domain_id from joiner script.
2017-07-25 11:10:34 140292899555456 [ERROR] WSREP: SST failed: 1 (Operation not permitted)
2017-07-25 11:10:34 140292899555456 [ERROR] Aborting
innobackup.move.log 日志文件错误如下:
Error: datadir must be specified
-----------------------------------------------------------------------------------
9.在其它两个节点上复制配置文件,注意其中的wsrep_node_name和wsrep_node_address需要根据节点实际情况修改
10.使用专有命令启动第一个节点
sudo galera_new_cluster
(传说中有很多中启动命令,例如 mysqld --wsrep-new-cluster --user=root & 或者 service mysql bootstrap 或者 mysqld_safe --wsrep-new-cluster 或者 service mysql start --wsrep-new-cluster,但其它几种我启动的时候都会报错。该命令暗示现在没有已存在的集群,启动的这台服务器是这个集群中的第一个,会产生新的集群UUID,如果集群已经存在还使用该命令会导致启动的服务器和已存在的集群不在一个集群体系中,因为产生了不一样的集群UUID)
11.在保证第一个节点启动后逐个启动其它节点,不要并行启动,可能会出预料不到的问题,如果第一个节点没启动,其它节点无法正常启动。
systemctl start mariadb
如果中间没出什么状况,这里就启动正常了。如果想验证节点是否启动成功,可以参考我的另一篇文章《3台CentOS-7安装Percona-XtraDB-Cluster-57集群》最下边的部分有提到,也可以使用强大的搜索引擎。
12.一定注意集群中最后关闭的服务器应该是下次启动的第一个服务器,因为集群判断这台服务器最后关闭所以具有最完整的数据,所以会设置在这台服务器之前关闭的服务器无法正常手动启动,如果强制启动需要手动将grastate.dat文件中的safe_to_boostrap设置为1后强行启动。