Mariadb5.5.52 主从复制集群的安装步骤
mariadb-5.5.52主從複製集群安裝步驟
一.因为网站业务对于数据读取一致性要求非常高,所以mariadb数据库就必须要用主从复制集群的形式来满足业务需求
二.复制配置过程简介
有两台Mariadb数据库服务器db01和db02,db01为主服务器,db02为从服务器,初始状态时,db01和db02中的数据信息完全相同,当db01中的数据发生变化时,db02也会跟着发生相应的变化,使得db01和db02的数据信息同步,从而达到备份的目的。
要点:
负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。
因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。
配置主从复制的过程:
1).主节点操作步骤
(1)启用二进制日志
(2)设置一个在当前集群中唯一的server-id;
(3)创建一个有复制权限(replication slave,replication client)帐号;
2).slave节点的操作步骤
(1)启用中继日志;
(2)设置一个在当前集群中唯一的server-id;
(3)使用有复制权限的用户帐号连接至主服务器,并启动复制线程;
注意:
(1)、服务器版本:主从服务器版本一致;
如果版本不一致,必须保证从服务器的版本高于主服务器的版本;
(2)、如果mariadb数据库的隔离级别为可读,其二进制日志格式尽量使用基于行的;
实验环境:
服务器版本为:
CentOS 7.2 64bit
数据库软件版本为:
mariadb-5.5.52
db01节点的IP地址:172.16.22.8
db02节点的IP地址:172.16.22.6
三.yum 安装Mariadb数据库
删除全部MySQL/MariaDB相关的rpm包
MySQL 已经不再包含在 CentOS 7 的源中,而改用了 MariaDB;
1、使用rpm -qa | grep mariadb搜索 MariaDB 现有的包:
如果存在,使用rpm -e --nodeps mariadb-*全部删除
2、使用rpm -qa | grep mysql搜索 mysql现有的包:
如果存在,使用yum remove mysql mysql-server mysql-libs compat-mysql全部删除;
我比较推荐使用系统自带的mariadb,这样直接yum安装即可
3、yum安装mariadb
[root@~]# yum install -y mariadb mariadb-server
#注:mariadb为数据库客户端,mariadb-server是数据库服务器端
4、命令启动MariaDB 服务
[root@~]# systemctl start mariadb
5、查看mariadb进程服务是否在跑
[root@~]# ps -ef | grep mariadb
root 10131 10095 0 19:24 pts/2 00:00:00 grep --color=auto mariadb
mysql 10197 10009 0 Jan19 ? 15:56:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/lib/mysql/zgz.pid --socket=/var/lib/mysql/mysql.sock
6、查看数据库状态
[root@~]# systemctl status mariadb
7、接着运行 mysql_secure_installation初始化配置MariaDB:
我觉得可以在这个阶段修改设定数据库密码,除了Disallow root login remotely 、Remove test database and accesss to it 可以為n,其他都是y。主要看你个人的实际需求进行设定。
8、登录 MariaDB 并创建相应的数据库用户与数据库
(1)使用mysql -uroot -p登录,回车之后会提示输入密码。
(2)创建新用户,CREATE USER 'git'@'localhost' IDENTIFIED BY '$password';其中$password填写自己设置的密码。当然后面也可以修改;
(3)设置存储引擎
mariadb[none]> set storage_engine=INNODB;
(4)创建数据库
mariadb[none]>create database database_name character set utf8;
(5)设置用户权限
grant all privileges on *.* to 'root'@'%' identified by '$password' with option;
#上述可以定义为使root用户授予任何机器都可以远程连接的最高权限,并具有授予其他人连接权。
#注:主从数据库Mariadb都可以按照上述安装方式安装即可。
四.数据库主从复制
1.主节点db01配置
对master进行配置,包括打开二进制日志,指定唯一的servr ID。
vim /etc/my.cnf,在[mysqld]这个配置段加入如下内容:
[mysqld]
#二进制变更日志
log-bin=mysql-bin
#二进制日志格式为混合模式
binlog_format=mixed
#为主服务器db01的ID值
server-id = 1
2.从节点db02配置:
配置/etc/my.cnf在[mysqld]这个配置段加入如下内容:
log-bin=mysql-bin
binlog_format=mixed
server-id = 12
relay-log = relay-bin
log_slave_updates = 1
read_only = on
#注:
server_id是必须且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置;
如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。
relay_log配置中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。
有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。故尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并不是很实用,特别是那些需要在slave上创建表的应用。
3.在Master节点db01的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中
命令如下:
[root@db01 ~]# mysql -u root -p
#建立一个帐户mysql_sync,并且只能允许172.16.22.6这个IP来登陆,密码是mysql_sync。
MariaDB [(none)]> grant replication client,replication slave on *.* to 'mysql_sync'@'172.16.22.6' identified by 'mysql_sync';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4.拷贝数据
关停Master服务器,将Master中的数据拷贝到从服务器节点中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!
但如果你的两台服务器是属于完全新安装的MariaDB主从服务器,这个一步就不需要。因为新建的数据库没有什么数据。
5.主从节点都重启mysqld服务;
主节点:
[root@db01 ~]# systemctl restart mariadb
从节点:
[root@db02 ~]# systemctl restart mariadb
6.启动从节点的中继日志
接下来就是让slave连接master,并开始重做master二进制日志中的事件。使用CHANGE MASTER TO语句取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。
命令介绍如下:使用help change master to即可查看命令选项
CHANGE MASTER TO option [, option] ...
option:
MASTER_BIND = 'interface_name'
| MASTER_HOST = 'host_name' 主服务器地址
| MASTER_USER = 'user_name' 有复制权限的用户名
| MASTER_PASSWORD = 'password' 用户密码
| MASTER_PORT = port_num 主服务器的端口
| MASTER_CONNECT_RETRY = interval 连接重试时间间隔
| MASTER_HEARTBEAT_PERIOD = interval 心跳检测时间间隔
| MASTER_LOG_FILE = 'master_log_name' 主服务器二进制日志文件
| MASTER_LOG_POS = master_log_pos 二进制日志文件中的位置
| RELAY_LOG_FILE = 'relay_log_name' 中继日志文件名称定义
| RELAY_LOG_POS = relay_log_pos 中继日志时间点定义
| MASTER_SSL = {0|1} 下面都都是跟SSL安全传输相关的
| MASTER_SSL_CA = 'ca_file_name'
| MASTER_SSL_CAPATH = 'ca_directory_name'
| MASTER_SSL_CERT = 'cert_file_name'
| MASTER_SSL_KEY = 'key_file_name'
| MASTER_SSL_CIPHER = 'cipher_list'
| MASTER_SSL_VERIFY_SERVER_CERT = {0|1}
| IGNORE_SERVER_IDS = (server_id_list)
需要记录的二进制日志文件的时间点是最后的那个点,我们先去主服务器节点查看哪个时间点,因为是新服务器,主节点上没什么重要数据:
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000007 | 426 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
启动从节点的中继日志:
[root@db02 ~]# mysql -uroot -p$password
#查看只读打开与否;
MariaDB [(none)]> show global variables like '%read_only%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | OFF |
| read_only | ON |
| tx_read_only | OFF |
+------------------+-------+
3 rows in set (0.01 sec)
#启动中继日志的命令如下;
MariaDB [(none)]> change master to master_host='172.16.22.8',master_user='mysql_sync',master_password='mysql_sync',master_log_file='mysql-bin.000007',master_log_pos=426,master_connect_retry=5,master_heartbeat_period=2;
Query OK, 0 rows affected (0.07 sec)
#查看从服务器状态;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 172.16.22.8
Master_User: mysql_sync
Master_Port: 3306
Connect_Retry: 5
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 426
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 426
Relay_Log_Space: 248
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
1 row in set (0.00 sec)
#通过查看从服务器状态,我们知道了从服务器的IO线程和SQL线程还未开启,下面我们就开启从服务器节点的复制进程,实现主从复制;
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
#再次查看从服务器状态,主要关注IO线程和SQL线程的开启状况:
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.22.8
Master_User: repluser
Master_Port: 3306
Connect_Retry: 5
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 426
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 535
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes #IOthread是否运行,如果为No代表slave运行不正常
Slave_SQL_Running: Yes #SQLthread是否运行,如果为No代表slave运行不正常
……中间信息略......
Seconds_Behind_Master: 0
slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。测试在下面进行,我们先来看看主从节点的线程的状态;
7.查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:
在Master节点db01上输入show processlist\G;
MariaDB [(none)]> show processlist \G
*************************** 1. row ***************************
Id: 5
User: mysql_sync
Host: 172.16.22.6:52875
db: NULL
Command: Binlog Dump
Time: 477
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
Progress: 0.000
*************************** 2. row ***************************
Id: 6
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: show processlist
Progress: 0.000
2 rows in set (0.00 sec)
1.row为处理slave的I/O线程的连接。
在Slave服务器节点db02上运行该语句:
MariaDB [(none)]> show processlist \G
*************************** 1. row ***************************
Id: 5
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: show processlist
Progress: 0.000
*************************** 2. row ***************************
Id: 6
User: system user
Host:
db: NULL
Command: Connect
Time: 587
State: Waiting for master to send event
Info: NULL
Progress: 0.000
*************************** 3. row ***************************
Id: 7
User: system user
Host:
db: NULL
Command: Connect
Time: 587
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
Progress: 0.000
3 rows in set (0.00 sec)
上述的2.row为SQL线程状态、3.row为I/O线程状态。
8.主从复制测试;
我们在主节点db01上创建数据库表格进入到test数据库
数据库存储引擎尽量是innodb
创建表格完成后我们到主节点查看:
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.03 sec)
MariaDB [(none)]> use test
Database changed
MariaDB [test]> show tables;
+-------------------+
| Tables_in_test |
+-------------------+
| test |
+-------------------+
1 rows in set (0.00 sec)
到从节点查看复制状态,可以看出复制已经进行了;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.22.8
Master_User: mysql_sync
Master_Port: 3306
Connect_Retry: 5
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 8640
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 8849
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 8640
Relay_Log_Space: 9140
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
1 row in set (0.00 sec)
查看从节点的数据库复制完成与否,可以查看出我们导入的test数据库表格是存在的:
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.02 sec)
MariaDB [(none)]> use test;
Database changed
MariaDB [test]> create table test;
MariaDB [test]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| test |
+-------------------+
1 rows in set (0.01 sec)
发现测试复制是成功的;
至此,数据库的主从复制就完成了.