在上篇《主從原理篇》中,基本上把主從復(fù)制原理、主從架構(gòu)模式、數(shù)據(jù)同步方式、復(fù)制技術(shù)優(yōu)化.....等各類細(xì)枝末節(jié)講清楚了,本章則準(zhǔn)備真正對聊到的幾種主從模式落地實(shí)踐,但實(shí)踐的內(nèi)容通常比較枯燥乏味,因?yàn)榫褪钦{(diào)整各種配置、設(shè)置各種參數(shù)等步驟。
本章中就搭建最基本的兩種常用搭建,一主一從/多從架構(gòu)、雙主/多主多寫架構(gòu),其他例如級聯(lián)復(fù)制架構(gòu)、多主一從架構(gòu)的配置過程大致相同,因此各位小伙伴可以舉一反三,這里就不再詳細(xì)展開實(shí)踐。
本身這章原本打算不寫的,因?yàn)閮?nèi)容相對會比較無趣,但看了一下網(wǎng)上的搭建教程基本雜亂無章,想要從零跟著搭建出一個完善的主從集群也不是易事,所以還是寫下這章實(shí)踐篇,系統(tǒng)性梳理好MySQL主從集群的詳細(xì)搭建過程。
PS:個人編寫的《技術(shù)人求職指南》小冊已完結(jié),其中從技術(shù)總結(jié)開始,到制定期望、技術(shù)突擊、簡歷優(yōu)化、面試準(zhǔn)備、面試技巧、談薪技巧、面試復(fù)盤、選Offer方法、新人入職、進(jìn)階提升、職業(yè)規(guī)劃、技術(shù)管理、漲薪跳槽、仲裁賠償、副業(yè)兼職……,為大家打造了一套“從求職到跳槽”的一條龍服務(wù),同時也為諸位準(zhǔn)備了七折優(yōu)惠碼:3DoleNaE,近期需要找工作的小伙伴可以復(fù)制鏈接了解詳情:https://s.juejin.cn/ds/USoa2R3/
其實(shí)基于Docker容器去構(gòu)建會更簡單,基本上就敲幾行命令,開放一下端口映射即可,但那種方式似乎缺少一些原汁原味,因此這里還是基于原生的Linux-CentOS7系統(tǒng),完成MySQL主從復(fù)制集群的搭建工作,但在此之前先安裝一個MySQL8.0版本。
?首先創(chuàng)建MySQL的目錄并進(jìn)入:
[root@localhost]# mkdir /soft && mkdir /soft/mysql/
[root@localhost]# cd /soft/mysql/
?下載MySQL的安裝包,可以通過FTP工具上傳離線環(huán)境包,也可通過wget命令在線獲取安裝包:
[root@localhost]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
沒有wget命令的可通過yum命令安裝:
[root@localhost]# yum -y install wget
?解壓MySQL的壓縮包,并對解壓后的目錄重命名:
[root@localhost]# tar -xvJf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
[root@localhost]# mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql8.0
?Linux-CentOS內(nèi)核會自帶MariaDB這個開源版的MySQL,因此在正式安裝前,一定要先檢測是否一下,如果存在則卸載一下:
[root@localhost]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
?卸載掉MariaDB后,進(jìn)入重命名后的目錄并創(chuàng)建一個data文件夾,用于存放數(shù)據(jù):
[root@localhost]# cd mysql8.0 && mkdir data
?配置系統(tǒng)的環(huán)境變量,配置好后記得刷新配置文件:
[root@localhost]# vi /etc/profile
# 在最后面加一行:
# export PATH=$PATH:/soft/mysql/mysql8.0/bin:/soft/mysql/mysql8.0/lib
# 按ESC鍵,輸入 :wq 保存退出
[root@localhost]# source /etc/profile
其實(shí)這一步不配置也行,MySQL8.0的啟動文件中,會自動去配置系統(tǒng)的PATH變量。
?接著要創(chuàng)建一個mysql的用戶組,并創(chuàng)建一個用戶和分配密碼、權(quán)限:
[root@localhost]# groupadd mysql
[root@localhost]# useradd -g mysql mysql
[root@localhost]# chown -R mysql.mysql /soft/mysql/mysql8.0
這一步千萬要做,有人也許會想:我可以直接用root用戶呀,的確可以用,但后續(xù)會產(chǎn)生天多的麻煩,因?yàn)槟阈枰謩痈暮芏嗪芏嗟呐渲梦募赃@一步千萬別省略,不要圖簡單!
?接著進(jìn)入MySQL解壓目錄下的bin文件夾,初始化MySQL的基本信息:
[root@localhost]# cd /soft/mysql/mysql8.0/bin
[root@localhost]# ./mysqld --user=mysql --basedir=/soft/mysql/mysql8.0 --datadir=/soft/mysql/mysql8.0/data/ --initialize
# 如果執(zhí)行報錯,請先執(zhí)行 yum install -y libaio 安裝一下依賴庫
這一步的命令略微有些長,但實(shí)際上的作用就是指定MySQL的系統(tǒng)用戶、安裝目錄、數(shù)據(jù)存放目錄等信息,這行命令執(zhí)行完成后會得到一個臨時密碼,也就是在最后一行輸出的結(jié)尾,如下:
臨時密碼
這個密碼各位小伙伴可以手動先復(fù)制出來,因?yàn)楹罄m(xù)需要通過這個臨時密碼連接MySQL。
?接著需要配置一下MySQL的配置文件,啟動MySQL時會默認(rèn)讀取/etc/my.cnf這個文件,因此配置如下:
[root@localhost]# vi /etc/my.cnf
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
上述最主要的是配置安裝目錄和數(shù)據(jù)目錄,這里僅是基礎(chǔ)配置,后續(xù)還會做更改~!
同時,MySQL的默認(rèn)目錄是/usr/local/mysql/,如果你和我一樣,沒有在這個目錄下安裝MySQL,那也記得一定要修改MySQL的啟動文件,如下:
[root@localhost]# cd /soft/mysql/mysql8.0
[root@localhost]# vi support-files/mysql.server
# 其中安裝目錄和數(shù)據(jù)目錄默認(rèn)為空,啟動時會去加載/usr/local/mysql/目錄
basedir=datadir=# 記得將其修改為你自定義的安裝目錄和數(shù)據(jù)目錄(最后不要加斜杠)
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
?修改完成后,接著先嘗試通過MySQL啟動腳本,運(yùn)行MySQL程序:
[root@localhost]# ./support-files/mysql.server start
Starting MySQL.Logging to '/soft/mysql/mysql8.0/data/localhost.localdomain.err'.
.. SUCCESS!
當(dāng)出現(xiàn)SUCCESS后表示啟動成功,接著可以查詢一下后臺進(jìn)程:
[root@localhost]# ps aux | grep mysql
?后臺有進(jìn)程則表示安裝成功,接著可以連接一下MySQL并重置密碼:
[root@localhost]# mysql -uroot -p
Enter password: (這里輸入前面得到的臨時密碼)
# 密碼輸入正確后會進(jìn)入MySQL終端,此時可以嘗試簡單查詢
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER ...
此時你會看到一個信息提示,也就是必須要通過ALTER USER重置密碼后,才能進(jìn)行操作:
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
重置密碼后再次進(jìn)行查詢,此時就能查詢出結(jié)果啦~:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.03 sec)
mysql> quit
?對MySQL-root賬號的密碼做了重置后,為了后續(xù)方便啟動,此時可將MySQL添加到系統(tǒng)服務(wù):
# 先停止MySQL服務(wù)
[root@localhost]# ./support-files/mysql.server stop
# 將MySQL啟動文件復(fù)制到系統(tǒng)etc目錄下
[root@localhost]# cp -a ./support-files/mysql.server /etc/init.d/mysql
# 給予啟動文件的執(zhí)行權(quán)限
[root@localhost]# chmod +x /etc/init.d/mysql
# 通過系統(tǒng)etc目錄下的啟動文件創(chuàng)建系統(tǒng)服務(wù)
[root@localhost]# chkconfig --add mysql
為MySQL創(chuàng)建好系統(tǒng)服務(wù)后,后續(xù)可通過service命令來快捷管理MySQL,指令如下:
# 查看MySQL服務(wù)的運(yùn)行狀態(tài)
[root@localhost]# service mysql status
# 啟動MySQL服務(wù)
[root@localhost]# service mysql start
# 停止MySQL服務(wù)
[root@localhost]# service mysql stop
# 重啟MySQL服務(wù)
[root@localhost]# service mysql reload
# 平滑重啟MySQL服務(wù)(先處理完已接收的SQL后再重啟)
[root@localhost]# service mysql force-reload
?通過服務(wù)命令啟動MySQL,并使用更改后的密碼連接:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
Enter password: 123456
Welcome to the MySQL monitor. Commands end with ;
.......
能夠看到上述歡迎信息,即表示一切無誤!
?MySQL8.0版本中,root賬號默認(rèn)是不接受遠(yuǎn)程連接的,因此這里還需要修改一下遠(yuǎn)程連接的權(quán)限:
# 進(jìn)入mysql系統(tǒng)庫
mysql> use mysql;
# 直接通過update修改系統(tǒng)用戶表
mysql> update user set host="%" where user="root";
# 刷新一下所有用戶的權(quán)限信息
mysql> flush privileges;
到這里,root用戶也支持遠(yuǎn)程連接了,但MySQL8.0的密碼認(rèn)證套件換掉了,所以需要通過SSL加密方式去連接,這里需要牢記!
上述這個流程,是經(jīng)過本人兩次實(shí)驗(yàn)的,所以絕對可靠,大家需要安裝時,只需無腦復(fù)制命令并執(zhí)行即可~
經(jīng)過第一階段后,安裝好了一個最基本的MySQL裸機(jī),但想要搭建主從集群,最少也需要兩個節(jié)點(diǎn),所以還需要再開一個節(jié)點(diǎn),如果為了圖簡單,也可以直接克隆上一臺機(jī)器,這樣最省時省力,我這里就不重復(fù)再安裝一次了,現(xiàn)有兩臺機(jī)器的信息如下:
大家也可以選擇更多的節(jié)點(diǎn)來作為從庫,方法基本上一樣,也就是再開一個節(jié)點(diǎn),配置和129的一樣即可。
首先一起來搭建一下MySQL的主節(jié)點(diǎn),大體可分為三步:
主從集群的配置實(shí)則非常簡單,只需修改前面安裝時的my.cnf文件即可,如果服務(wù)器是Windows系統(tǒng),則找到對應(yīng)的my.ini文件做修改,在修改前記得先停掉MySQL服務(wù),然后將主庫的/etc/my.cnf文件修改成如下內(nèi)容:
[root@localhost]# service mysql stop
[root@localhost]# vi /etc/my.cnf
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------接下來的是主從集群配置-------
# 主庫在主從集群中的唯一標(biāo)識
server-id=1
# 開啟bin-log日志,并為bin-log日志取個前綴名(有默認(rèn)值可不寫)
log-bin=mysql-bin-log
# 同步復(fù)制時過濾的庫(主要將一些不需要備份/同步庫寫進(jìn)來)
# 也可以通過binlog-do-db=xx1,xx2... 來指定要復(fù)制的目標(biāo)庫
binlog-ignore-db=mysql
# 指定bin-log日志的格式為混合模式(默認(rèn)為statement)
binlog_format=mixed
# 設(shè)置單個binlog日志文件的最大容量
max_binlog_size=1024M
更改/etc/my.cnf文件后,因?yàn)楹罄m(xù)從庫會通過網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)同步,因此還需要對外開放相應(yīng)的3306端口,同時也要記得刷新防火墻,如下:
[root@localhost]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports
如果嫌這樣比較麻煩,也可以直接將防火墻關(guān)閉:
[root@localhost]# systemctl stop firewalld.service
但最好不要這樣做,因?yàn)楸3窒到y(tǒng)防火墻的正常運(yùn)轉(zhuǎn),在線上情況時,往往比裝N多個殺毒軟件都管用,系統(tǒng)自帶的防火墻能夠有效的協(xié)助咱們攔截大量網(wǎng)絡(luò)攻擊和木馬植入。
開放對應(yīng)的數(shù)據(jù)庫端口后,接著重啟MySQL服務(wù)并使用root登錄,稍后從庫需要一個賬號作為同步賬號,這里可以用root賬號,但最好再創(chuàng)建一個用戶做區(qū)分,同時新的賬號也可以做精準(zhǔn)的權(quán)限控制:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
mysql> create user 'zhuzi'@'%' identified with mysql_native_password by '666666';
mysql> grant replication slave on *.* to 'zhuzi'@'%';
上面我為了圖簡單,因此直接為新用戶zhuzi分配了所有權(quán)限,但線上環(huán)境最好根據(jù)自己的需求取分配權(quán)限!
這里有個小細(xì)節(jié)要牢記,我在創(chuàng)建用戶時通過with指定密碼套件為mysql_native_password,這是早版本中,默認(rèn)的密碼認(rèn)證套件,而在MySQL8.0中則將默認(rèn)套件換成了caching_sha2_password,如果基于默認(rèn)的認(rèn)證套件創(chuàng)建用戶,后續(xù)通過該賬號連接時,則需要以SSL加密形式連接。
最后來簡單查看一下master主節(jié)點(diǎn)的狀態(tài),如下:
mysql> show master status;
主庫狀態(tài)
目前主庫的bin-log日志正在使用mysql-bin-log.000001這個文件,Position也就是《主從原理篇》中提到的POS點(diǎn),更具體一點(diǎn)的說,它代表當(dāng)前日志文件的光標(biāo)位置,每個MySQL節(jié)點(diǎn)都有可能不一致,因此MySQL5.7之后的版本并不會使用這種最基本的數(shù)據(jù)復(fù)制方式,這里先做簡單演示,后續(xù)會使用GTID復(fù)制。
前面配置好了MySQL的主庫,接著再來弄一下MySQL從庫,配置步驟也大致相同,但這里需要牢記一點(diǎn):如果你的單/多個從節(jié)點(diǎn)是直接克隆出來的,一定要記得更改的一下server_uuid,因?yàn)榭寺?dǎo)致每個節(jié)點(diǎn)的server_uuid相同,這種情況下是無法搭建出主從集群的。
更改server_uuid的方式也很簡單,MySQL在啟動時會隨機(jī)生成一個UUID放到數(shù)據(jù)目錄下的auto.cnf文件中,如果是克隆出來的機(jī)器,直接rm -rf移除auto.cnf文件,再次重啟MySQL后又會生成一個新的UUID。
同樣得先修改一下從庫的/etc/my.cnf文件,將其配置為如下格式:
[root@localhost]# service mysql stop
[root@localhost]# vi /etc/my.cnf
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------接下來的是主從配置-------
# 從庫在主從集群中的唯一標(biāo)識
server-id=2
# 開啟bin-log日志(為了主從切換時使用,不開啟bin-log的從機(jī)只能當(dāng)備庫使用)
log-bin=mysql-bin-log
# 同步復(fù)制時要過濾的庫
binlog-ignore-db=mysql
# 指定bin-log日志的格式為混合模式
binlog_format=mixed
# 設(shè)置單個binlog日志文件的最大容量
max_binlog_size=1024M
# 開啟relay-log日志(同樣可以指定前綴名)
relay_log=mysql-relay-log
# 開啟存儲過程、函數(shù)、觸發(fā)器等內(nèi)容的同步功能
log_bin_trust_function_creators=true
# 同步執(zhí)行跳過一些錯誤碼(防止同步寫入時出現(xiàn)錯誤導(dǎo)致復(fù)制中斷)
slave_skip_errors=1062
如果你的從庫只打算作為備庫使用,那則無需再開啟從庫的bin-log日志,因?yàn)檫@會讓從庫的性能下降,畢竟寫數(shù)據(jù)時還需要多寫一次日志,相較于只寫數(shù)據(jù)而言,性能開銷近乎降低一倍。但如若從庫還打算用于熱備切換,那則必須也要開啟bin-log日志,否則這個從節(jié)點(diǎn)升級為主庫后,無法接收客戶端SQL寫入數(shù)據(jù),也無法給其他從庫提供數(shù)據(jù)復(fù)制的基礎(chǔ)。
不僅僅只有主庫需要開放3306端口,從庫所在的機(jī)器同樣需要,因?yàn)橹鲝闹g是基于TCP/IP協(xié)議來構(gòu)建網(wǎng)絡(luò)連接,從而實(shí)現(xiàn)傳輸數(shù)據(jù)的,TCP協(xié)議是一種對端協(xié)議,一方的端口未開放都有可能導(dǎo)致數(shù)據(jù)傳輸出現(xiàn)問題:
[root@localhost]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports
想要配置主庫的連接賬號,從庫也需要先登錄root賬號,或者其他具備權(quán)限的賬號也行,接著執(zhí)行下述命令即可:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
mysql> change master to master_host='192.168.12.128',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_log_file='mysql-bin-log.000001',
master_log_pos=653;
也就是基于原本主庫上創(chuàng)建的zhuzi賬號,以此來建立網(wǎng)絡(luò)連接,在主庫數(shù)據(jù)更新后,從庫會以客戶端的方式請求主庫的bin-log日志,接著寫入到自身的relay-log日志中,后續(xù)從庫上的SQL線程會讀取relay-log日志解析執(zhí)行。
這里額外提一句:如果你主庫上創(chuàng)建的遠(yuǎn)程賬號,使用了8.0中默認(rèn)的caching_sha2_password套件,那在這里連接時,也僅僅只需要在最后加上一行master_ssl=1即可!
從庫上連接好賬號之后,接著需要啟動一下從庫線程:
mysql> start slave;
mysql> show slave status\G;
上述命令執(zhí)行完成后,會出現(xiàn)下面這一堆信息:
從庫狀態(tài)
在其中必須要看到Slave_IO_Running、Slave_SQL_Running兩個線程的狀態(tài)都為Yes時,這才意味著主從集群搭建完成。
前面手把手帶著諸位將最基本的主從集群搭建出來了,如果你想要為主節(jié)點(diǎn)搭載更多的從庫,只需要再多開幾個機(jī)器/節(jié)點(diǎn),重復(fù)前面的從庫配置即可,接著來實(shí)際測試看看主從同步的效果,先看看主從節(jié)點(diǎn)各自的數(shù)據(jù)情況:
# 查詢主節(jié)點(diǎn)的庫信息
mysql> show databases;
+--------------------+
|Database|
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows inset(0.01 sec)
# 查詢從節(jié)點(diǎn)的庫信息
mysql> show databases;
+--------------------+
|Database|
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows inset(0.01 sec)
從上述信息中可看出,目前主、從節(jié)點(diǎn)都屬于裸機(jī)狀態(tài),其中沒有任何數(shù)據(jù),接著先在主節(jié)點(diǎn)上創(chuàng)建一個名為db_zhuzi的庫:
mysql> create database db_zhuzi;
庫同步
從上圖的效果中,也能夠明顯看出,雖然從節(jié)點(diǎn)上未主動創(chuàng)建庫,但從節(jié)點(diǎn)會直接將主節(jié)點(diǎn)上創(chuàng)建的db_zhuzi庫直接同步過來,接著再創(chuàng)建一張zz_users看看:
mysql> create table `zz_users` (
`user_id`int(8)notnull,
`user_name` varchar(255)notnull,
`user_sex` varchar(255)notnull,
`password` varchar(255)notnull,
`register_time` datetime
)
engine=InnoDB
character set=utf8
collate=utf8_general_ci
row_format=Compact;
表同步
從效果圖上看,不僅僅之前創(chuàng)建庫的操作會同步,創(chuàng)建表的記錄依舊會通過bin-log日志同步過來,這也就意味著DDL語句都會做同步,那接下來再試試DML語句,也就是增、刪、改語句的效果是怎么樣呢?
mysql> insert into `zz_users` values(1,"熊貓","女","6666",now()),(2,"竹子","男","1234",now());
數(shù)據(jù)同步
效果依舊十分明顯,咱們只在master節(jié)點(diǎn)上執(zhí)行了數(shù)據(jù)插入動作,但從節(jié)點(diǎn)上依舊可以查詢出數(shù)據(jù),這也就意味著主庫上插入的數(shù)據(jù),也被同步過來啦~,對于修改、刪除操作則不再重復(fù)演示,大家可以自己玩一玩,效果依舊是相同的!
經(jīng)過第二階段的內(nèi)容講解后,就已經(jīng)完成了最傳統(tǒng)的主從集群搭建,但這種集群有一個令人十分難受的點(diǎn),也就是當(dāng)主節(jié)點(diǎn)宕機(jī)后,假設(shè)從節(jié)點(diǎn)成為了新主,如果這里還有其他從節(jié)點(diǎn),就需要指向新主,但POS定位又會成為一個問題,畢竟各個從庫之間的復(fù)制進(jìn)度也許不一致,所以需要開發(fā)/運(yùn)維人員手動介入,才能尋找到合適的同步點(diǎn)。
也正是由于上述這個問題,所以在MySQL5.6中引入了一種名為GTID復(fù)制的技術(shù),專門用于處理從庫尋點(diǎn)的問題,在前面配置從節(jié)點(diǎn)時,需要咱們手動指定master_log_pos=653同步點(diǎn),而開啟GTID復(fù)制后則可根治該問題,但具體如何操作呢?接著咱們來實(shí)操一下。
因?yàn)橹霸蹅儚膸煲呀?jīng)配置好了同步,因此這里需要停止一下從庫的同步線程,如下:
mysql> stop slave;
停止從庫的同步線程,接著主從節(jié)點(diǎn)都需要退出連接,然后停止MySQL服務(wù):
mysql> quit
[root@localhost]# service mysql stop
接著需要再次更改兩個節(jié)點(diǎn)的/etc/my.cnf文件,增加如下內(nèi)容:
# 開啟GTID復(fù)制
gtid_mode=on
# 跳過一些可能導(dǎo)致執(zhí)行出錯的SQL語句
enforce-gtid-consistency=true
接著再重啟兩個節(jié)點(diǎn)上的MySQL服務(wù),然后登錄從節(jié)點(diǎn),再通過下述命令建立與主庫的連接:
mysql> change master to master_host='192.168.12.128',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_auto_position=1;
從這里可以看到,原本需要通過master_log_file='mysql-bin-log.000001', master_log_pos=653指定同步的日志文件和同步點(diǎn),但在GTID復(fù)制模式中,只需要設(shè)置一個master_auto_position=1即可,接下來它會自動尋找同步點(diǎn),接著來試試效果,但不要忘了在從機(jī)上啟動slave線程:
mysql> start slave;
測試結(jié)果如下:
GTID復(fù)制
如果未開啟GTID復(fù)制,主從節(jié)點(diǎn)的數(shù)據(jù)同步必須要求手動指定POS同步點(diǎn),從庫會依照指定同步點(diǎn)開始同步數(shù)據(jù),而開啟GTID復(fù)制模式后,MySQL會自動尋找數(shù)據(jù)的同步點(diǎn)。
MySQL5.7中對原有的半同步復(fù)制模式做了增強(qiáng),也就是引入了無損復(fù)制的模式,具體的概念可參考上篇《MySQL主從原理篇-無損復(fù)制》,MySQL的無損復(fù)制是插件式實(shí)現(xiàn)的,這也就意味著想要使用還需要先安裝插件,如下:
主節(jié)點(diǎn)執(zhí)行:INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
從節(jié)點(diǎn)執(zhí)行:INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
分別在主從節(jié)點(diǎn)上安裝后,接著依舊要停止同步線程、退出連接、關(guān)閉MySQL服務(wù),接著再次修改主從的/etc/my.cnf配置文件,內(nèi)容如下:
# 主節(jié)點(diǎn)上新增配置:
# 開啟無損復(fù)制
rpl_semi_sync_master_enabled=on
# 等待從節(jié)點(diǎn)ACK的時長(不指定默認(rèn)為10s)
rpl_semi_sync_master_timeout=3000
# 從節(jié)點(diǎn)上新增配置:
rpl_semi_sync_slave_enabled=on
在各自的文件中新增上述配置后,再次重啟MySQL服務(wù)就能將復(fù)制模式改為無無損復(fù)制方案,但線上最好不要使用這種無損復(fù)制,因?yàn)闀?dǎo)致MySQL整體性能直線下滑,如果對數(shù)據(jù)實(shí)時性要求較高,可以引入Canal中間件來監(jiān)控主節(jié)點(diǎn)的Bin-log日志。
經(jīng)過第三階段的學(xué)習(xí)后,咱們掌握了一些主從集群中的高級特性,接著再來搭建一下另一種十分流行的主從架構(gòu)方案,也就雙主/多主多寫架構(gòu),其實(shí)這種多主的思想十分簡單,好比目前我這兩個節(jié)點(diǎn)組成的集群,兩個互為各自的主節(jié)點(diǎn),也互為各自的從節(jié)點(diǎn),這里就不對這些概念做重復(fù)敘述了,不了解的可參考《主從原理篇-多種主從架構(gòu)模型》中的詳細(xì)說明,這里就直接上實(shí)戰(zhàn)。
這里也就是將原本的128節(jié)點(diǎn),再在其配置文件中加上從庫的配置信息,然后再設(shè)置一下自增步長和初始值即可,完整配置文件如下:
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------主節(jié)點(diǎn)配置-------
# 當(dāng)前節(jié)點(diǎn)在集群中的唯一標(biāo)識
server-id=1
# 開啟bin-log日志,并為bin-log日志取個前綴名(有默認(rèn)值可不寫)
log-bin=mysql-bin-log
# 同步復(fù)制時過濾的庫(主要將一些不需要備份/同步庫寫進(jìn)來)
# 也可以通過binlog-do-db=xx1,xx2... 來指定要復(fù)制的目標(biāo)庫
binlog-ignore-db=mysql
# 指定bin-log日志的格式為混合模式(默認(rèn)為statement)
binlog_format=mixed
# 設(shè)置單個binlog日志文件的最大容量
max_binlog_size=1024M
# ------GTID配置-------
# 開啟GTID復(fù)制
gtid_mode=on
# 跳過一些可能導(dǎo)致執(zhí)行出錯的SQL語句
enforce-gtid-consistency=true
# ------從節(jié)點(diǎn)配置-------
# 開啟relay-log日志(同樣可以指定前綴名)
relay_log=mysql-relay-log
# 開啟存儲過程、函數(shù)、觸發(fā)器等內(nèi)容的同步功能
log_bin_trust_function_creators=true
# 同步執(zhí)行跳過一些錯誤碼(防止同步寫入時出現(xiàn)錯誤導(dǎo)致復(fù)制中斷)
slave_skip_errors=1062
# ------自增序列配置-------
# 設(shè)置自增初始值為1
auto_increment_offset=1
# 設(shè)置自增步長為2,自增序列為{1、3、5、7、9.....}
auto_increment_increment=2
上面完成了第一個節(jié)點(diǎn)配置后,接著再來配置第二個節(jié)點(diǎn)的信息,基本上大致相同,主要有兩點(diǎn)不同的地方:
[mysqld]
basedir=/soft/mysql/mysql8.0
datadir=/soft/mysql/mysql8.0/data
port=3306
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
# ------主節(jié)點(diǎn)配置-------
# 當(dāng)前節(jié)點(diǎn)在集群中的唯一標(biāo)識
server-id=2
# 開啟bin-log日志,并為bin-log日志取個前綴名(有默認(rèn)值可不寫)
log-bin=mysql-bin-log
# 同步復(fù)制時過濾的庫(主要將一些不需要備份/同步庫寫進(jìn)來)
# 也可以通過binlog-do-db=xx1,xx2... 來指定要復(fù)制的目標(biāo)庫
binlog-ignore-db=mysql
# 指定bin-log日志的格式為混合模式(默認(rèn)為statement)
binlog_format=mixed
# 設(shè)置單個binlog日志文件的最大容量
max_binlog_size=1024M
# ------GTID配置-------
# 開啟GTID復(fù)制
gtid_mode=on
# 跳過一些可能導(dǎo)致執(zhí)行出錯的SQL語句
enforce-gtid-consistency=true
# ------從節(jié)點(diǎn)配置-------
# 開啟relay-log日志(同樣可以指定前綴名)
relay_log=mysql-relay-log
# 開啟存儲過程、函數(shù)、觸發(fā)器等內(nèi)容的同步功能
log_bin_trust_function_creators=true
# 同步執(zhí)行跳過一些錯誤碼(防止同步寫入時出現(xiàn)錯誤導(dǎo)致復(fù)制中斷)
slave_skip_errors=1062
# ------自增序列配置-------
# 設(shè)置自增初始值為1
auto_increment_offset=2
# 設(shè)置自增步長為2,自增序列為{1、3、5、7、9.....}
auto_increment_increment=2
第二個節(jié)點(diǎn)的配置信息和第一個節(jié)點(diǎn)的信息,只有兩點(diǎn)不同:
接著需要先啟動一下原本作為從庫的192.168.12.129節(jié)點(diǎn),同樣需要創(chuàng)建一個同步賬號,如下:
[root@localhost]# service mysql start
[root@localhost]# mysql -uroot -p
mysql> create user 'zhuzi'@'%' identified with mysql_native_password by '666666';
mysql> grant replication slave on *.* to 'zhuzi'@'%';
創(chuàng)建好了賬號后,接著再啟動192.168.12.128節(jié)點(diǎn)的MySQL服務(wù),兩個節(jié)點(diǎn)都通過root賬號登錄,接著執(zhí)行下述命令,都將對方指定為自己的主節(jié)點(diǎn):
# 192.168.12.128節(jié)點(diǎn)上執(zhí)行,將192.168.12.129設(shè)為自己的主節(jié)點(diǎn)
mysql> change master to master_host='192.168.12.129',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_auto_position=1;
# 192.168.12.129節(jié)點(diǎn)上執(zhí)行,將192.168.12.128設(shè)為自己的主節(jié)點(diǎn)
mysql> change master to master_host='192.168.12.128',
master_user='zhuzi',
master_password='666666',
master_port=3306,
master_auto_position=1;
最后再分別啟動各自的同步線程:
mysql> start slave;
然后再在任意一個節(jié)點(diǎn)上創(chuàng)建一張zz_user用戶表:
mysql> create table `zz_user` (
`user_id`int(8)notnull auto_increment,
`user_name` varchar(255),
primary key (`user_id`)using btree
)
engine=InnoDB
character set=utf8
collate=utf8_general_ci
row_format=Compact;
上述表中將user_id設(shè)置為了主鍵,并具備自增特性,同時因?yàn)閮蓚€節(jié)點(diǎn)互為主從,所以在一個節(jié)點(diǎn)上創(chuàng)建表之后,就會自動同步給另一個節(jié)點(diǎn),因此無需在兩個節(jié)點(diǎn)上都創(chuàng)建表,測試一下:
雙主復(fù)制
從上述結(jié)果中可明顯看出效果,這也就意味著咱們的雙主雙寫架構(gòu)就搭建完成啦!兩臺節(jié)點(diǎn)都支持客戶端讀寫數(shù)據(jù),同時兩個節(jié)點(diǎn)都具備完整數(shù)據(jù),這也就是所謂的雙主雙寫架構(gòu),大家也可以用更多的節(jié)點(diǎn)來搭建環(huán)形多主架構(gòu),但之前《MySQL優(yōu)化篇-架構(gòu)優(yōu)化》中聊過,搭建雙主以上的多主架構(gòu)則沒有必要了,可以直接將架構(gòu)升級到分庫分表。
前面的步驟中實(shí)現(xiàn)了數(shù)據(jù)庫的主備、主主搭建,但這僅僅只是數(shù)據(jù)庫的基礎(chǔ)架構(gòu),如果想要將這些架構(gòu)應(yīng)用到業(yè)務(wù)中,還得解決客戶端的連接問題,畢竟現(xiàn)在從原有的單庫變?yōu)榱硕鄮欤虼硕鄶?shù)據(jù)源的連接需要再通過新的手段處理,業(yè)內(nèi)一般有三種做法:
基于上述三種方案,配置好多數(shù)據(jù)源的管理后,業(yè)務(wù)系統(tǒng)在線上運(yùn)行時,會自行根據(jù)SQL類型分發(fā)請求,比如主從搭建讀寫分離架構(gòu),就是將SQL以insert、delete、update、alter...這類關(guān)鍵字開頭的語句,分發(fā)到主節(jié)點(diǎn)處理,對于select這類關(guān)鍵字開頭的語句,分發(fā)到從節(jié)點(diǎn)處理。
對于雙主雙寫的架構(gòu)而言,就只需要取模分發(fā)或隨機(jī)分發(fā)即可,無需區(qū)分讀寫操作,畢竟兩個節(jié)點(diǎn)都會相互同步數(shù)據(jù),因此最終都會具備完整的數(shù)據(jù),所以集群內(nèi)的任意節(jié)點(diǎn),都具備處理讀寫請求的能力。
PS:雖然本章中只搭建了一主多從、多主多寫兩種架構(gòu),但對于多主一從、級聯(lián)復(fù)制這兩種架構(gòu),也僅僅只是節(jié)點(diǎn)數(shù)量的分配不同,因此大家有興趣可自行搭建,這里就不再重復(fù)贅述~
同時,為了確保數(shù)據(jù)庫集群的高可用,一般也會結(jié)合Keeplived+VIP來對各節(jié)點(diǎn)做虛擬IP映射和宕機(jī)檢測,這樣能夠確保MySQL出現(xiàn)宕機(jī)時,能夠第一時間將流量切換到新主上,并且也能夠快速重啟宕機(jī)的程序,但Keeplived+VIP在之前關(guān)于《Nginx高可用》的文章詳細(xì)講過,大家感興趣可以去看看,這里同樣不做重復(fù)贅述。
來源:企業(yè)官網(wǎng)
主營建筑工程造價軟件、自稱2022年的市場占有率接近八成,廣聯(lián)達(dá)(002410.SZ)近日因“疑似全員年終獎歸0”的話題沖上社交平臺熱榜。
2024年1月以來,多名廣聯(lián)達(dá)員工在社交平臺爆料稱:公司將全體員工年終績效強(qiáng)制清零,員工入職時簽的合同offer有14薪、有15薪,這意味著上萬名員工將無法拿到年終獎,相當(dāng)于工資被削減了20%。
此后,廣聯(lián)達(dá)總裁辦公室向全體員工發(fā)出一封公開信緩和局勢,內(nèi)容提到:2023年經(jīng)營結(jié)果未達(dá)預(yù)期,為平衡公司長短期的經(jīng)營需要,總裁辦公會做出了績效獎金的相應(yīng)決策。結(jié)合當(dāng)前對2023年財務(wù)結(jié)果的預(yù)估,公司會根據(jù)績效結(jié)果對員工進(jìn)行相應(yīng)激勵。公司經(jīng)營管理團(tuán)隊(duì)對整體經(jīng)營結(jié)果擔(dān)責(zé),年度獎金為零。
2023年前三季度,廣聯(lián)達(dá)凈利潤大幅下滑,盈利相較于限制性股票激勵計劃的解禁條件甚遠(yuǎn)。房地產(chǎn)及建筑業(yè)景氣度深度下滑,主營業(yè)務(wù)受到?jīng)_擊,公司在提價銷售、打擊盜版、利用公共資源交易中心拓展市場等方面頻出“盤外招”,也引發(fā)了市場非議。
一位認(rèn)證為廣聯(lián)達(dá)在職員工的網(wǎng)友在社交平臺表示:“此前口頭通知是年終獎全員歸零,內(nèi)外網(wǎng)抗議后,公司總裁辦又發(fā)了一封公開信,口頭傳達(dá)的結(jié)果是只會給績效得分A和B+的人發(fā)一點(diǎn)激勵,但如何評定績效等級以及相應(yīng)發(fā)放多少并未公布。”
廣聯(lián)達(dá)最近一份財務(wù)報表顯示,公司出現(xiàn)營收增速下滑、凈利潤大跌的情況。截至2023年前三季度,公司營業(yè)收入為47.49億元,較去年同期增長7.02%;歸屬上市公司股東凈利潤出現(xiàn)大幅下跌,第三季度同比下降94.44%,前三季度合計凈利潤為2.61億元,同比下跌59.02%。
對于收入增速下滑,廣聯(lián)達(dá)在業(yè)績報告中解釋:受宏觀經(jīng)濟(jì)增速放緩、房地產(chǎn)投資下行、建筑業(yè)項(xiàng)目開工下降等因素影響,公司所服務(wù)的建筑行業(yè)相關(guān)客戶面臨一定的經(jīng)營壓力,出于控制成本費(fèi)用等考慮,客戶當(dāng)前在數(shù)字化方面的投入強(qiáng)度有所降低。
針對2023年第三季度凈利潤大跌,廣聯(lián)達(dá)解釋:公司營業(yè)總成本比2022年同期增加6.93億元,同比增長18.34%,營業(yè)總成本增速高于營業(yè)收入增速,導(dǎo)致凈利潤下滑較多。營業(yè)總成本增加主要是人力成本和折舊攤銷增加所致,其中人力成本增加 4.99億元,主要是去年員工人數(shù)增加所致。
有廣聯(lián)達(dá)員工稱,廣聯(lián)達(dá)年終獎清零是為了滿足2023年限制性股票的盈利解禁條件。
2022年9月8日,廣聯(lián)達(dá)披露的《關(guān)于向2022年限制性股票激勵計劃激勵對象授予限制性股票的公告》顯示:公司以25.04元/股的價格,向管理團(tuán)隊(duì)和核心骨干人員417人授予限制性股票775.95萬股。
其中,公司董事、總裁袁正剛獲授24萬股限制性股票,占授予限制性股票總數(shù)的3.0930%;高級副總裁劉謙獲授16.8萬股,占比為2.1651%,包括此2人在內(nèi),共8位高管獲授數(shù)量均在8萬股以上,剩余不到88%的份額由其他409位公司核心管理人員、核心技術(shù)(業(yè)務(wù))骨干分享。
此次激勵計劃的解禁考核年度為2022-2024年三個會計年度,考核目標(biāo)分別為:2022年凈利潤不低于9.5億元、2023年凈利潤不低于12.5億元、2024年凈利潤不低于15.6億元。
其中,第一個限售期在2023年10月屆滿,廣聯(lián)達(dá)完成凈利潤不低于9.5億元的目標(biāo),上述高層及骨干解除限售比例為40%的股票,且已于2023年10月24日開始上市流通。但從2023年前三季度2.62億元的凈利潤表現(xiàn)來看,距離12.5億元的全年考核目標(biāo)有著不小的差距。
2023年8月召開的一次投資者交流會議上,廣聯(lián)達(dá)董事會秘書李樹劍曾表示:“外部環(huán)境大大低于年初設(shè)想,公司收入增速降低后,還要保持研發(fā)和營銷費(fèi)用,我們也不裁員,所有成本加在一起使得公司利潤達(dá)成目標(biāo)的壓力會非常大。”
李樹劍提到,公司會通過收縮虧損業(yè)務(wù)、保持造價業(yè)務(wù)穩(wěn)定增長等方式,使整體利潤有穩(wěn)定增速。造價業(yè)務(wù)在2023年前三季度錄得36.73億元的營收,占總營收比例高達(dá)77.34%。
2022年7月,廣聯(lián)達(dá)高管在接受媒體采訪時稱,公司造價軟件在全國市場的占有率達(dá)80%以上。廣聯(lián)達(dá)的營收從2018年的28.62億元攀升至2022年的65.52億元。期間,廣聯(lián)達(dá)的造價軟件收費(fèi)模式由買斷制改為年費(fèi)制,且?guī)缀跄昴隄q價。
一位造價行業(yè)從業(yè)者認(rèn)為,面對一個規(guī)模增長見頂?shù)氖袌觯瑥V聯(lián)達(dá)的實(shí)際舉措是改變了造價業(yè)務(wù)的銷售政策,將多年訂單調(diào)整為年度訂單,后者的折扣幅度更低,此舉被市場理解為變相提價。
廣聯(lián)達(dá)回應(yīng)稱,此舉是為了緩解上游大客戶的資金壓力,比如地產(chǎn)類客戶。在業(yè)績會上,廣聯(lián)達(dá)高管稱:“簽三年合同肯定是有一定的折扣,但這個折扣我們也是可控的,比如說控制在八折水平上,不能降到?jīng)]底線,長遠(yuǎn)來看,我們對自身業(yè)務(wù)還是有信心的。”
2023年房地產(chǎn)及建筑業(yè)景氣度深度下滑,廣聯(lián)達(dá)主營業(yè)務(wù)受到?jīng)_擊,也引發(fā)了公司一些不尋常的舉動。
多名造價從業(yè)者反映,為打擊盜版售賣行為,廣聯(lián)達(dá)向造價從業(yè)者銷售的帶有著作權(quán)的軟件加密鎖(軟件破解驅(qū)動程序)有強(qiáng)制售賣、逐年提價等情況。據(jù)悉,軟件加密鎖用于控制廣聯(lián)達(dá)軟件的使用權(quán)限,可以將廣聯(lián)達(dá)軟件的使用權(quán)限與特定的硬件設(shè)備綁定,從而防止盜版和非法復(fù)制行為。使用時,用戶需要將鎖插入計算機(jī)的USB接口,然后通過廣聯(lián)達(dá)軟件對鎖進(jìn)行授權(quán),才能正常使用軟件。
一把軟件加密鎖在2020年之前的費(fèi)用不到1萬元,使用期限為一年。2023年,一把軟件加密鎖的價格漲至1.5萬元左右。一份大型房企區(qū)域公司的權(quán)力清單運(yùn)行責(zé)任監(jiān)督備案表顯示,因公司項(xiàng)目支付審計部編織工程預(yù)算、審核工程進(jìn)度和結(jié)算款等工作的需要,需向廣聯(lián)達(dá)支付加密鎖年費(fèi),2把鎖的價格為29600元。
盜版加密鎖的年費(fèi)僅為幾百元,因此,部分工程造價從業(yè)者選擇盜版鎖,一位造價從業(yè)者表示:“前幾年,廣聯(lián)達(dá)對于盜版鎖的態(tài)度是默許存在的。有點(diǎn)像微軟默認(rèn)盜版Windows軟件存在一樣,這樣可以擴(kuò)大市場占有率,借此還可以培養(yǎng)用戶的使用習(xí)慣,讓你習(xí)慣使用廣聯(lián)達(dá)軟件。但2023年開始,廣聯(lián)達(dá)查殺盜版鎖行動開始頻繁,很多盜版鎖用戶的工程文件被查殺。”
此外,對于不同時段保存的計價文件,廣聯(lián)達(dá)會進(jìn)行“無差別攻擊”,即對廣聯(lián)達(dá)老版本正版鎖編制的文件,標(biāo)識為盜版文件,對其進(jìn)行強(qiáng)制上鎖破壞,使得過往計價數(shù)據(jù)無法恢復(fù)。或者未使用盜版鎖,只是接收了盜版鎖編制的文件,也會導(dǎo)致軟件被鎖。
無論是因?yàn)槭褂迷缒臧姹镜膹V聯(lián)達(dá)軟件鎖、還是接收盜版鎖文件導(dǎo)致軟件被鎖,直接有效的解決方案都是購買新鎖。
此外,一位工程造價人員反映,廣聯(lián)達(dá)涉及違規(guī)收集用戶資料情況。在安裝新版廣聯(lián)達(dá)驅(qū)動時,廣聯(lián)達(dá)會給電腦植入隨機(jī)數(shù)字命名的文件夾,且不能強(qiáng)制查殺該文件。
在拓展新業(yè)務(wù)及新客戶方面,廣聯(lián)達(dá)也遭遇競爭對手的非議,被指控不正當(dāng)競爭。
深圳建信云科技有限公司(下稱“建信云”)針對廣聯(lián)達(dá)發(fā)起了一系列訴訟。其中一起民事案件在深圳立案,2023年7月11日第一次開庭,8月25日再次開庭。建信云認(rèn)為,廣聯(lián)達(dá)利用為政府公共資源交易中心開發(fā)電子系統(tǒng)的便利,推廣自己的商業(yè)軟件,限制其他競爭對手。
2021年8月和2022年11月,廣聯(lián)達(dá)先后兩次中標(biāo)深圳公共資源交易中心系統(tǒng)建設(shè)項(xiàng)目,中標(biāo)金額接近2億元,成為公共資源交易中心的技術(shù)開發(fā)商。作為官方唯一的標(biāo)書編制工具軟件提供方,廣聯(lián)達(dá)通過該渠道推廣銷售自家開發(fā)的商業(yè)軟件。此外,深圳公共資源交易中心提供的九種建模軟件種類,有六種都是廣聯(lián)達(dá)的商業(yè)軟件或安裝了廣聯(lián)達(dá)插件的軟件。
公開資料顯示,2018年至2022年間,廣聯(lián)達(dá)中標(biāo)的北京市區(qū)兩級公共資源交易中心系統(tǒng)建設(shè)業(yè)務(wù)有20多個。2022年報顯示,廣聯(lián)達(dá)的數(shù)字交易業(yè)務(wù)營業(yè)收入突破4億元,其中公共資源交易管理系統(tǒng)的運(yùn)維、運(yùn)營收入占比持續(xù)提升。
在2023年中期業(yè)績會上,廣聯(lián)達(dá)的高管表示,房地產(chǎn)的開工數(shù)量下降比較大,行業(yè)正在面臨從地產(chǎn)類項(xiàng)目逐步向基建類、城市更新類項(xiàng)目的結(jié)構(gòu)型轉(zhuǎn)移。
作者|宋虹姍
編輯|岳嘉
作者|宋虹姍
掃碼加群請備注公司、職位、姓名