Mysql和MariaDB的最基本的集羣方式是主從方式,也是衆多中小企業使用最多的集羣方式,該集羣部署簡單,輕鬆上手,讓我們一步步來吧。
測試所用版本爲MariaDB 10.1 源碼安裝,安裝到默認路徑/usr/local/mysql下。
$ BUILD/autorun.sh $ ./configure $ make -j4 $ sudo make install
既然是主從數據庫,至少需要兩個數據庫實例,本文例子將兩個實例部署在同一臺電腦裏,計劃配置如下表。
實例作用 | 地址 | 端口 | 數據文件路徑 | 配置文件路徑 |
主 | localhost | 10001 | /home/lyw/db/data/1 | /home/lyw/db/etc/my1.cnf |
從 | localhost | 10002 | /home/lyw/db/data/2 | /home/lyw/db/etc/my2.cnf |
準備兩個mysql的配置文件my1.cnf, 我們從默認配置複製過來
$ mkdir -p /home/lyw/db/etc/ $ cd /usr/local/mysql $ cp support-files/my-medium.cnf /home/lyw/db/etc/my1.cnf $ cp support-files/my-medium.cnf /home/lyw/db/etc/my2.cnf
my1.cnf修改如下幾行
[mysqld] port = 10001 socket = /tmp/mysql1.sock log-bin = mysql-bin server-id = 10001 datadir = /home/lyw/db/data/1 user = lyw
my2.cnf修改如下幾行
[mysqld] port = 10002 socket = /tmp/mysql2.sock log-bin = mysql-bin server-id = 10002 datadir = /home/lyw/db/data/2 user = lyw
分別初始化兩個數據庫
$ mkdir -p /home/lyw/db/data/ $ scripts/mysql_install_db --defaults-file=/home/lyw/db/etc/my1.cnf $ scripts/mysql_install_db --defaults-file=/home/lyw/db/etc/my2.cnf
啓動兩個數據庫
由於是在一臺電腦裏,因此沒有使用服務啓動,而是直接用mysqld_safe啓動,大家儘可根據自己的情況啓動。
$ bin/mysqld_safe --defaults-file=/home/lyw/db/etc/my1.cnf & $ bin/mysqld_safe --defaults-file=/home/lyw/db/etc/my2.cnf &
檢查兩個數據庫是否啓動成功,對應的端口和sock文件已經存在,即表示啓動成功。
$ sudo netstat -nlp |grep mysql tcp6 0 0 :::10001 :::* LISTEN 22211/mysqld tcp6 0 0 :::10002 :::* LISTEN 23536/mysqld unix 2 [ ACC ] STREAM LISTENING 365439 22211/mysqld /tmp/mysql1.sock unix 2 [ ACC ] STREAM LISTENING 368511 23536/mysqld /tmp/mysql2.sock
MariaDB默認有兩行任何本機用戶都能登陸,會影響新創建的複製用戶的登陸,因此需要刪除。然後創建複製用戶方可生效。(如果是在兩臺不同的電腦中運行,可以不刪除這兩行。)
$ bin/mysql -S /tmp/mysql1.sock -uroot MariaDB [(none)]> use mysql; MariaDB [mysql]> delete from user where user=''; MariaDB [mysql]> flush privileges; MariaDB [mysql]> grant replication slave on *.* to 'rep'@'%' identified by '123456';
然後查看master數據庫的運行狀態,記下這兩個值。
MariaDB [mysql]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000005 | 1075 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
在從服務器上執行
$ bin/mysql -S /tmp/mysql2.sock -uroot MariaDB [(none)]> change master to master_host='localhost', master_port=10001, master_user='rep', master_password='123456', master_log_file='mysql-bin.000005', master_log_pos=1075; MariaDB [(none)]> start slave; MariaDB [(none)]> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: localhost Master_User: rep Master_Port: 10001 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 1075 Relay_Log_File: lyw-hp-relay-bin.000002 Relay_Log_Pos: 537 Relay_Master_Log_File: mysql-bin.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes
如果Slave_IO_Running 和 Slave_SQL_Running 都爲Yes,則說明啓動主從配置成功。
測試:
在master數據庫執行
MariaDB [mysql]> create database lyw; Query OK, 1 row affected (0.00 sec) MariaDB [mysql]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lyw | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
在slave數據庫執行
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lyw | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
可見在主庫創建的數據庫lyw,在從庫也有。可以在主庫嘗試執行其他寫入語句,在叢庫也能看到同樣的數據。
用同樣的方法,一個主數據庫後面可以跟多個從數據庫,增加數據的可靠性和讀的吞吐量。
如果主庫也配置上從從庫同步數據,即互爲主從,那就是常說的雙主,或主主,有些文章裏會說修改下自增漲id以防止衝突,我卻不這樣認爲,雙主的兩個數據庫並非強一致,而是有一定的延遲,很多事務處理會出現錯誤,皆因爲延遲導致。雙主並不能大大增強寫入的吞吐量,因爲所有數據都要在每個庫寫入。雖然說因爲批量的緣故可以有少量提升,但是對於延遲導致的錯誤來說,微不足道。
配置雙主是有意義的,但是並非用於同時寫入,同一時間還是隻寫一個庫,而當主掛了後,爲切換主從做的準備,切換後,主再次啓動時,立馬就能同步到從的數據。比如在cobar集羣中,就可以考慮用雙主配置。
以上是傳統主從複製方法,從Mysql5.6和MariaDB10.0開始,有了新的主從複製方式,可參考這篇文章:http://bangbangba.blog.51cto.com/3180873/1702294