我们在每个节点上都做如下配置:
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
测试环境可以直接关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
环境我们建议添加对应的端口。galera集群需要3306、25、4567和4444端口:
for port in 3306 25 4567 4444;do firewall-cmd --zone=public --add-port=$port/tcp --permanent ;done
firewall-cmd --reload
firewall-cmd --list-ports
设置上海时区
timedatectl set-timezone Asia/Shanghai
配置NTP:
yum install -y chrony
server ntp1.aliyun.com iburst
systemctl enable chronyd.service
systemctl start chronyd.service
chronyc sources
我们将节点hostname写到本地hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
116.202.176.98 releases.galeracluster.com
172.24.14.251 mysql01
172.24.14.250 mysql02
172.24.14.249 mysql03
yum update openssl
mysql galera集群由2部分组成:Galera Replication Library (galera-3)和mysql-wsrep。我们可以访问START SECURING YOUR DATA
NOW获取对应版本的mysql galera。点击进去,我们会发现,其实就是galera的yum源。所以我们第一步就是配置yum源。
如上描述,galera集群需要galera-3和对应版本的mysql-wsrep,所以对应的yum源也需要这两个:
[galera]
name = Galera
baseurl = https://releases.galeracluster.com/galera-3/centos/7/x86_64
gpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1
[mysql-wsrep]
name = MySQL-wsrep
baseurl = https://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
gpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1
完成以后重建一下缓存:
yum clean all
yum makecache
#很多教程中没有安装rsync,必须安装
yum -y install galera-3 mysql-wsrep-5.7 rsync
配置my.conf。我们想为集群做如下修改:
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/data/mysql/mysqld.pid
[mysqld]
validate_password_policy=0
validate_password_length=4
!includedir /etc/my.cnf.d/
注意:
validate_password_policy和validate_password_length两个配置是为了取消密码复杂策略。但是初始化数据库的时候,可能会有问题。初始化数据库的时候,可以先取消;等初始化完成以后,再添加该配置。
注意:
1、5.7的galera默认没有!includedir /etc/my.cnf.d/配置,如果我们想要开启额外配置,需要添加该配置项;
2、注意pid-file配置,改配置项和sytemd管理的服务配置有冲突。我们在下面需要修改
修改systemd服务配置文件。mysqld服务的systemd配置文件为/usr/lib/systemd/system/mysqld.service。默认情况下,该配置文件里有如下两项配置:
[Service]
......
PIDFile=/var/run/mysqld/mysqld.pid
......
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS $MYSQLD_RECOVER_START
......
我们需要删除PIDFile=/var/run/mysqld/mysqld.pid配置,并将ExecStart的–pid-file=/var/run/mysqld/mysqld.pid项去掉。这样my.conf中的pid-file配置才能生效。
注:如果不需要修改pid的位置,不需要做次操作。
最终配置如下:
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
TimeoutSec=0
PermissionsStartOnly=true
ExecStartPre=/usr/bin/mysqld_pre_systemd --pre
ExecStart=/usr/sbin/mysqld --daemonize $MYSQLD_OPTS $MYSQLD_RECOVER_START
ExecStartPost=/usr/bin/mysqld_pre_systemd --post
EnvironmentFile=-/etc/sysconfig/mysql
LimitNOFILE = 5000
Restart=on-failure
RestartSec=1
RestartPreventExitStatus=1
PrivateTmp=false
设置mysqld开机启动,并启动mysqld
systemctl enable mysqld
systemctl start mysqld
获取初始化密码:
[root@mysql03 ~]# cat /var/log/mysqld.log | grep password
2021-03-22T14:45:33.728361Z 1 [Note] A temporary password is generated for root@localhost: u0aq2>Y86+dL
初始化数据库:
#由于我,们修改了sock的位置,所以要-S指定sock
mysql_secure_installation -S /data/mysql/mysql.sock
注:我们将root密码设置成相同。
关闭所有节点mysqld服务
systemctl stop mysqld
配置主节点galera。我们建议将mysqld的额外配置都放到/etc/my.cnf.d/下。比如本实例中/etc/my.cnf.d/galera.cnf。最终配置如下:
[mysql]
#设置mysql client default character
default-character-set=utf8
no-auto-rehash
[mysqld]
bind-address=0.0.0.0
character-set-server=utf8
default-storage-engine=INNODB
default-time-zone='+8:00'
skip-name-resolve
#slow query
slow_query_log=on
log_output=FILE
slow_query_log_file=/var/log/mysql_slow.log
long_query_time=1
max_connections=5000
table_open_cache=2048
sort_buffer_size=8M
thread_cache_size=16
#MyISAM
key_buffer_size=512M
read_buffer_size=8M
read_rnd_buffer_size=8M
#InnoDB
# You can set .._buffer_pool_size up to 50 - 80 % of RAM but beware of setting memory usage too high
innodb_buffer_pool_size=20G
#galera innodb参数
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
transaction-isolation=READ-COMMITTED
#galera cluster参数
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"
wsrep_sst_method=rsync
wsrep_sst_auth=galera-user:galera-user-password
wsrep_cluster_name=cloud_database_cluster
#wsrep_cluster_address="gcomm://mysql01,mysql02,mysql03"
wsrep_cluster_address="gcomm://"
wsrep_node_name=mysql01
wsrep_node_address="172.24.14.251"
注意:
1、主节点在配置的时候wsrep_cluster_address不用设置。
2、galera-user:galera-user-password可以单独设置同步用户,而不适用root密码。
3、wsrep_node_name和wsrep_node_address为本节点信息,其他节点要修改。
初始化集群:
mysqld_bootstrap
该命令会启动本机的 mysqld 服务。注意mysqld_bootstrap 命令只在集群第一个节点启动时使用,因为该脚本中带有一个参数:–wsrep-new-cluster,代表新建集群。
执行完成以后,我们可以查看一下mysqld的服务状态确认mysqld是否正常运行。如果正常运行,我们登录到mmysql数据库执行如下命令:
mysql>SHOW STATUS LIKE 'wsrep%';
如果出现如下两个状态,说明正常:
......
| wsrep_cluster_size | 1 |
......
| wsrep_ready | ON |
+------------------------------+----------------------------------------------------------+
从节点的/etc/my.cnf.d/galera.cnf和主节点的基本一致,区别在于如下三个:
wsrep_cluster_address="gcomm://mysql01"
wsrep_node_name=mysql02
wsrep_node_address="172.24.14.250"
注意:
1、从节点初始化的时候,wsrep_cluster_address只设置已经正常的节点,为了方便,我们可以统一设置为wsrep_cluster_address=“gcomm://mysql01”。
2、wsrep_node_name和wsrep_node_address为本节点信息。
从节点数据库启动只需要正常的start就行
systemctl start mysqld
集群初始化完成以后,我们可以将wsrep_cluster_address的配置统一调整为如下:
wsrep_cluster_address="gcomm://mysql01,mysql02,mysql03"
这样三个节点间就可以相互同步。
疑问:该步骤不知道是否必须或者是否适合?
2021-03-22T15:42:54.222885Z 0 [ERROR] WSREP: wsrep_load(): dlopen(): /usr/lib64/galera-3/libgalera_smm.so: symbol SSL_COMP_free_compression_methods, version libssl.so.10 not defined in file libssl.so.10 with link time reference
2021-03-22T15:42:54.222903Z 0 [ERROR] WSREP: wsrep_load(/usr/lib64/galera-3/libgalera_smm.so) failed: Invalid argument (22). Reverting to no provider.
升级openssl
yum update openssl
2021-03-22T16:33:29.791371Z 0 [Note] WSREP: Running: 'wsrep_sst_rsync --role 'joiner' --address '172.24.14.249' --datadir '/data/mysql/' --defaults-file '/etc/my.cnf' --defaults-group-suffix '' --parent '7628' '' '
which: no rsync in (/usr/sbin:/sbin:/usr//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
2021-03-22T16:33:29.806339Z 0 [ERROR] WSREP: Failed to read 'ready <addr>' from: wsrep_sst_rsync --role 'joiner' --address '172.24.14.249' --datadir '/data/mysql/' --defaults-file '/etc/my.cnf' --defaults-group-suffix '' --parent '7628' ''
Read: ''rsync' not found in PATH'
2021-03-22T16:33:29.806450Z 0 [ERROR] WSREP: Process completed with error: wsrep_sst_rsync --role 'joiner' --address '172.24.14.249' --datadir '/data/mysql/' --defaults-file '/etc/my.cnf' --defaults-group-suffix '' --parent '7628' '' : 2 (No such file or directory)
2021-03-22T16:33:29.806493Z 2 [ERROR] WSREP: Failed to prepare for 'rsync' SST. Unrecoverable.
2021-03-22T16:33:29.806506Z 2 [ERROR] Aborting