centos7 安装部署Mariadb10.4集群,并且在线搭建备库

安装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步即可

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值