安装xtrabackup (非必须)
1 下载
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.14/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.14-1.el7.x86_64.rpm
wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
安装依赖包
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-DBI perl-Digest-MD5
rpm -ivh --force libev-4.04-2.el6.x86_64.rpm
rpm -ivh --force percona-xtrabackup-80-8.0.14-1.el7.x86_64.rpm
mariadb安装(安装集群前所有节点都要进行以下步骤)
1 下载安装
请自行官网下载,我使用版本为mariadb-10.5.6
2 安装依赖包
yum -y install readline-devel zlib-devel openssl-devel libaio-devel gcc perl lsof socat telnet net-tools
3 添加mysql用户以及创建mysql相关目录
提前预定mysql的安装目录为/app/mariadb并且数据目录为/app/mariadb/data,这里要建立用户和目录,并且赋予mysql用户权限,操作如下:
tar -xvf mariadb-10.5.6-linux-systemd-x86_64.tar.gz
mv mariadb-10.4.15-linux-systemd-x86_64 /app/mariadb
systemctl stop firewalld.service
systemctl disable firewalld.service
mkdir -p /app/mariadb
mkdir -p /app/mariadb/data
mkdir -p /var/run/mariadb
mkdir -p /var/log/mariadb
groupadd -r mysql
useradd -g mysql -s /sbin/nologin mysql
chown -R mysql:mysql /app/mariadb
chown -R mysql:mysql /var/log/mariadb
chown -R mysql:mysql /var/run/mariadb
安装maridb,将安装包解压到/app下并重命名为mariadb
# 进入mariadb目录
cd /app/mariadb
./scripts/mysql_install_db --basedir=/app/mariadb --user=mysql --datadir=/app/mariadb/data
假如安装失败,请删除/app/mariadb/data中的所有文件以及rm -rf /var/lib/mysql/*中所有文件
4 配置mariadb服务自启动
cp ./support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
vi /etc/init.d/mysqld
basedir=/app/mariadb
datadir=/app/mariadb/data
设置mysql自启动
/sbin/chkconfig mysqld on
5 配置环境变量
echo 'export PATH=/app/mariadb/bin:$PATH' > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
vi /etc/hosts
192.168.200.15 mariadb1
192.168.200.16 mariadb2
192.168.200.17 mariadb3
192.168.200.18 mariadb4
6 修改mariadb配置文件
vi /etc/my.cnf
!includedir /etc/my.cnf.d
[mysqld]
skip_name_resolve
user = mysql
# 每台节点不一样
pid-file = /app/mariadb/mysql_mariadb1.pid
# 每台节点不一样
server-id = 10
default-storage-engine =InnoDB
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect ='SET NAMES utf8mb4'
performance-schema-instrument='memory/%=COUNTED'
interactive_timeout = 172800
wait_timeout = 172800
lower_case_table_names = 1
sql-mode =ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sysdate-is-now = 1
#setting for Memory
# 每台节点不一样
log-error = mariadb1_error.log
slow-query-log = 1
slow-query-log-file = mariadb1_slow.log
expire-logs-days =1
relay_log_recovery = 1
# 需要与Galera配置文件一样
log-bin = mariadb_bin.log
relay-log = mariadb_relay.log
#setting memory:PGA
read_buffer_size = 512K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
thread_stack = 256K
join_buffer_size = 2M
binlog_cache_size = 2M
max-connections = 4000
innodb_log_buffer_size =32M
innodb-buffer-pool-size = 1G
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 256M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table = 1
query-cache-type = 0
query-cache-size = 0
event_scheduler =on
userstat =on
thread-cache-size = 50
open-files-limit = 65535
table-definition-cache = 4096
table-open-cache = 10
bulk_insert_buffer_size = 64M
tmp-table-size = 8M
large-pages
socket=/app/mariadb/mysql.sock
basedir=/app/mariadb
datadir=/app/mariadb/data
vi /etc/my.cnf.d/mysql-clients.cnf
[client]
socket=/app/mariadb/mysql.sock
default-character-set=utf8
[mysql]
default-character-set=utf8
socket=/app/mariadb/mysql.sock
注意:这几个mysql.sock必须完全一样否则可能造成无法登陆
4 修改root密码以及设置远程访问权限
alter user root@'localhost' identified by 'root';
grant all privileges on *.* to root@'%' identified by 'root' with grant option;
mariadb的Galera集群安装
1 安装依赖包并且关闭selinux
yum -y install rsync
2 修改集群配置文件
vi /etc/my.cnf.d/server.cnf
# 在[mysqld]下加入以下,注意server-id必须保证每台机器不重复
[mysqld]
server-id=1
log-bin=mariadb_bin.log
socket=/app/mariadb/mysql.sock
basedir=/app/mariadb
datadir=/app/mariadb/data
[galera]
wsrep_on=ON
#galera的库文件的地址,由于我使用的是解压版,所以这个包在maraidb解压目录下
wsrep_provider=/app/mariadb/lib/libgalera_smm.so
# 集群中的其他节点地址,第一次执行行请在第一个节点改为gcomm://,机器全部启动后在修改回来
wsrep_cluster_address="gcomm://192.168.200.16:4030,192.168.200.17:4030"
#节点主机名
wsrep_node_name=maridb1
#节点ip
wsrep_node_address=192.168.200.15
#二进制日志设置为行模式
binlog_format=row
#使用的默认引擎
default_storage_engine=InnoDB
#性能最好
innodb_autoinc_lock_mode=2
#并行复制线程数
wsrep_slave_threads=1
#0.log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
#1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
#2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作
innodb_flush_log_at_trx_commit=0
#设置缓存池大小
innodb_buffer_pool_size=120M
#远程同步
wsrep_sst_method=rsync
#避免各个节点的数据不一致,这种情况需要等待全同步复制
wsrep_causal_reads=ON
wsrep_cluster_name=mariadb_cluster
wsrep_on=ON
wsrep_node_incoming_address=192.168.200.15
wsrep_sst_receive_address=192.168.200.15:4020
wsrep_provider_options="gmcast.listen_addr=tcp://192.168.200.15:4030;gcs.fc_limit=500;gcs.fc_factor=1.0;gcache.size=1536M;ist.recv_bind=192.168.200.15:4070"
注:wsrep_node_name,wsrep_node_address要根据自己的节点进行配置,wsrep_node_name与wsrep_node_address千万别写错,我写错了调了1天才发现,因为日志报错不明显
3 启动集群服务
#首先停止mariadb数据库
service mysqld stop
# 第一次启动需要初始化(仅在主节点启动,以下两种使用其中一种就行)
#不需要修改配置文件
/app/mariadb/bin/mysqld --user=mysql --wsrep-new-cluster &
service mysql start ---wsrep-new-cluster
# 启动集群服务(其他节点执行)
service mysqld start
4 查询状态指令
show status like 'wsrep_local_state_comment';
show status like 'wsrep_cluster_size';
注意:
-
1 由于我在执行galera_new_cluster时报错
[ERROR] WSREP: wsrep_load(): dlopen(): libssl.so.1.0.0: cannot open shared object file: No such file or directory
[ERROR] WSREP: wsrep_load(): dlopen(): /lib64/libcrypto.so.1.0.0: version `OPENSSL_1.0.0’ not found (required by /app/mariadb/lib/libgalera_smm.so)
由于我没找到其他方法只能编译安装openssl1.0.0,编译方法如下:
下载https://www.openssl.org/source/old/1.0.0/openssl-1.0.0s.tar.gz
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz tar -xvf openssl-1.0.1u.tar.gz cd openssl-1.0.1u make clean ./config -fPIC --prefix=/app/openssl --openssldir=/app/openssl -Wl,-rpath,/app/openssl/lib shared make depend make && make install ln -s /app/openssl/lib/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.1.0.0 ln -s /app/openssl/lib/libssl.so.1.0.0 /usr/lib64/libssl.so.1.0.0
-
2 第一次启动
启动第一个节点以前,其节点的配置文件里面,不能配置其它节点的ip,即 wsrep_cluster_address=gcomm:// 这样就行了,否则会导致启动报错。待集群启动后,再修改它的配置文件,把其他节点的ip补充上去。
在第一个节点执行galera_new_cluster mysqld,该命令会启动本机的 mysqld 服务,命令只在集群第一个节点启动时使用,因为该脚本中带有一个参数:–wsrep-new-cluster,代表新建集群。
-
3 什么叫第一次启动
第一次启动的意思是,只要集群中还有机器存活,那么就不是第一次启动,假如所有节点全部停止,那么就必须按照第一次启动执行
mariadb的Galera集群添加备库
主库设置
1 设置备份用户
选择其中一个主库数据库执行
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
flush privileges;
3 查看当前状态
show master status
备库设置
1 修改配置文件
vi /etc/my.cnf
[mysqld]
skip_name_resolve
user = mysql
replicate_wild_do_table=test.%
slave_run_triggers_for_rbr=1
# 每台节点不一样
pid-file = /app/mariadb/mysql_mariadb4.pid
# 每台节点不一样
server-id = 40
default-storage-engine =InnoDB
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect ='SET NAMES utf8mb4'
performance-schema-instrument='memory/%=COUNTED'
interactive_timeout = 172800
wait_timeout = 172800
lower_case_table_names = 1
sql-mode =ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sysdate-is-now = 1
#setting for Memory
log-error = mariadb1_error.log
slow-query-log = 1
slow-query-log-file = mariadb1_slow.log
expire-logs-days =1
relay_log_recovery = 1
# 需要与Galera配置文件一样
#log-bin = mariadb_bin.log
relay-log = mariadb_relay.log
# 过滤mysql库下的所有表不进行同步
replicate-wild-ignore-table=mysql.%
log-slave-updates
# 设置只读模式,可以不开
read-only = ON
#setting memory:PGA
read_buffer_size = 512K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
thread_stack = 256K
join_buffer_size = 2M
binlog_cache_size = 2M
max-connections = 4000
innodb_log_buffer_size =32M
innodb-buffer-pool-size = 1G
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 256M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table = 1
query-cache-type = 0
query-cache-size = 0
event_scheduler =on
userstat =on
thread-cache-size = 50
open-files-limit = 65535
table-definition-cache = 4096
table-open-cache = 10
bulk_insert_buffer_size = 64M
tmp-table-size = 8M
socket=/app/mariadb/mysql.sock
basedir=/app/mariadb
datadir=/app/mariadb/data
vi /etc/my.cnf.d/mysql-clients.cnf
[client]
socket=/app/mariadb/mysql.sock
default-character-set=utf8
[mysql]
default-character-set=utf8
socket=/app/mariadb/mysql.sock
2 启动从库
# 进入mariadb目录
cd /app/mariadb
./scripts/mysql_install_db --basedir=/app/mariadb --user=mysql --datadir=/app/mariadb/data
serivce mysqld restart
3 查看状态
MariaDB [(none)]> show global variables like 'read%';
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| read_binlog_speed_limit | 0 |
| read_buffer_size | 524288 |
| read_only | ON |
| read_rnd_buffer_size | 262144 |
+-------------------------+--------+
## 如有需要,可以临时设置数据库可写
MariaDB [(none)]> set global read_only=1;
4 添加复制用户
创建仅指定数据库可以访问的用户,(通过my.cnf将从服务器配置为只读模式. 在只读模式下, 只有super权限的用户和slave同步线程才能写入.)
GRANT ALL PRIVILEGES ON DatabaseName.* TO 'wroot'@'%' IDENTIFIED BY 'wroot' WITH GRANT OPTION;
初始化主备库
1 锁定主库(不必须,因为某些备份工具自带此功能)
其实主库可以不进行锁定,只要保证业务不再更新数据就行,因为锁定风险比较大
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLE;
2 备份数据库
# 主库执行(其中一个即可)
mysqldump -uroot -p --events --triggers --routines --flush-logs --master-data=2 --lock-all-tables --databases a> dbbackup.sql
- single-transaction 这个参数只对innodb适用,实现热备InnoDB表;因此,不需要同时使用–lock-all-tables;
- databases 后面跟除mysql以后的其他所有数据库的库名 (测试库上只有 t1 t2 t3 三个库)
- master-data 参数会记录导出快照时候的mysql二进制日志位置,一会会用到。
- lock-all-tables 为所有表加读锁
如果有MYISAM或者既有MYISAM又有INNODB,就用如下命令生成快照
mysqldump -uroot -p --events --triggers --routines --flush-logs --master-data=2 --lock-tables --databases a > dbbackup.sql
3 查看备份集的binlog
由于恢复备库的时候需要制定binlog位置,所以我们需要查看备份集备份出来的日志
head -n 200 dbbackup.sql
找到如下语句
-- CHANGE MASTER TO MASTER_LOG_FILE='mariadb_bin.000007', MASTER_LOG_POS=389;
然后将备份集发送到备库上即可
4 恢复数据库
在备库进行数据库恢复
mysql -uroot -proot
MariaDB [a]> source /usr/MyWorkSpace/dbbackup.sql
5 设置备库同步线程(备库)
MariaDB [a]> change master to master_host='192.168.200.15',master_user='slave',master_password='slave',master_log_file='mariadb_bin.000007',master_log_pos=389;
MariaDB [a]> start slave;
// 支持row模式binlog触发器
MariaDB [a]> set global slave_run_triggers_for_rbr = 'ENFORCE';
6 查看备库状态(备库)
show slave status\G:
7 错误修正
假如 change master出错之后可以通过如下命令,删除同步
MariaDB [a]> stop slave;
MariaDB [a]> reset slave;
MariaDB [a]> stop slave ;set global sql_slave_skip_counter=1;start slave;#跳过异常记录
然后重复上述2,3,4,5步即可