您好,登錄后才能下訂單哦!
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)
發現測試復制是成功的;
至此,數據庫的主從復制就完成了.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。