mysql 数据库集群搭建:(三)CentOS 7.2 MariaDB 10.2 galera 集群安装

Wesley13
• 阅读 865

《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 文件)

mysql 数据库集群搭建:(三)CentOS 7.2 MariaDB 10.2 galera 集群安装

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

mysql 数据库集群搭建:(三)CentOS 7.2 MariaDB 10.2 galera 集群安装
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点击进入
mysql 数据库集群搭建:(三)CentOS 7.2 MariaDB 10.2 galera 集群安装
3.2选择"CentOS"->"CentOS7"->"1.2[stable]"
mysql 数据库集群搭建:(三)CentOS 7.2 MariaDB 10.2 galera 集群安装
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后强行启动。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这