mysql slave是什么_创建slave的搜索结果-阿里云开发者社区
Rainbond部署Mysql主從集群應用說明
Mysql主從同步原理
1)在Slave 服務器上執行sart slave命令開啟主從復制開關,開始進行主從復制。
2)此時,Slave服務器的IO線程會通過在master上已經授權的復制用戶權限請求連接master服務器,并請求從執行binlog日志文件的指定位置(日志文件名和位置就是在配置主從復制服務時執行change master命令指定的)之后開始發送binlog日志內容。
3)Master服務器接收到來自Slave服務器的IO線程的請求后,其上負責復制的IO線程會根據Slave服務器的IO線程請求的信息分批讀取指定binlog日志文件指定位置之后的binlog日志信息,然后返回給Slave端的IO線程。返回的信息中除了binlog日志內容外,還有在Master服務器端記錄的IO線程。返回的信息中除了binlog中的下一個指定更新位置。
4)當Slave服務器的IO線程獲取到Master服務器上IO線程發送的日志內容、日志文件及位置點后,會將binlog日志內容依次寫到Slave端自身的Relay Log(即中繼日志)文件(Mysql-relay-bin.xxx)的最末端,并將新的binlog文件名和位置記錄到master-info文件中,以便下一次讀取master端新binlog日志時能告訴Master服務器從新binlog日志的指定文件及位置開始讀取新的binlog日志內容。
5)Slave服務器端的SQL線程會實時檢測本地Relay Log 中IO線程新增的日志內容,然后及時把Relay LOG 文件中的內容解析成sql語句,并在自身Slave服務器上按解析SQL語句的位置順序執行應用這樣sql語句,并在relay-log.info中記錄當前應用中繼日志的文件名和位置點。
Mysql主從同步注意事項
master節點和slave節點的uuid不同
master節點和slave節點的server_id不同
slave節點需要自動執行向master節點注冊的操作
制作Mysql容器鏡像
同一鏡像創建不同容器的uuid
用同一mysql鏡像創建mysql主從集群時,發現每臺mysql服務的uuid都是相同的,是因為在數據初始化時將uuid寫在了/var/lib/mysql/auto.cnf文件中,造成每個容器的uuid都是相同的。
為了解決不同容器的uuid不同問題,需要在mysql啟動生成配置文件后并在啟動前 隨機生成一個uuid寫入到/var/lib/mysql/auto.cnf,這樣就可以確保同一鏡像生成的容器的uuid都不相同。
為了達成這一目標,我們修改了mysql鏡像自帶的啟動腳本/usr/local/bin/docker-entrypoint.sh:
if [ ! -d "$DATADIR/mysql" ]; then
file_env 'MYSQL_ROOT_PASSWORD'
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
echo >&2 'error: database is uninitialized and password option is not specified '
echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
exit 1
fi
mkdir -p "$DATADIR"
echo 'Initializing database'
"$@" --initialize-insecure
echo 'Database initialized'
# 位于mysql啟動腳本90行,新增如下語句
psd="/proc/sys/kernel/random/uuid"
str=$(cat $psd)
uuid="server-uuid="${str}
echo "[auto]" > /var/lib/mysql/auto.cnf
echo $uuid >> /var/lib/mysql/auto.cnf
同一服務不同實例的server_id處理
用同一MYSQL鏡像創建MYSQL主從集群時,如何確保每個MYSQL服務的server_id不同?
k8s在創建容器時,會為每個容器創建創建一個主機名( 如:gr78648d-0),創建多個容器后面的數字會依次遞增,所以可以利用這一特性生成不同的server_id(主機名數字部分 + 指定數字),然后在maser和slave使用不同的數字即可。
從庫自動初始化
創建slave數據庫時,我們希望salve應用下的每個實例,在擴容后,會自動向主庫注冊。
這需要salve應用中實例初始化時,自動執行指定的SQL腳本。這要借助于官方MYSQL鏡像所提供的特定功能:數據庫初始化時,會自動讀取/docker-entrypoint-initdb.d/中*.sql 文件并執行。
為了實現上述兩個目標,我們在鏡像的自定義啟動腳本 /run/docker-entrypoint.sh進行指定:
# define server_id and anyother cluster configuration
# 通過環境變量來區分當前鏡像創建主庫或從庫
if [ ${MYSQL_ROLE} == "master" ];then
# 借助有狀態應用主機名特點,截取其中的數字
server_id=${HOSTNAME#*-}
# 主庫ID設置為1
MYSQLC_MYSQLD_SERVER_ID=`expr $server_id + 1`
export MYSQLC_MYSQLD_SERVER_ID
# 指定生成主庫特定的配置
export MYSQLC_MYSQLD_binlog_ignore_db=mysql
export MYSQLC_MYSQLD_log_bin=mysql-bin
else
# 借助有狀態應用主機名特點,截取其中的數字
server_id=${HOSTNAME#*-}
# 從庫各實例ID,從2開始排序
MYSQLC_MYSQLD_SERVER_ID=`expr $server_id + 2`
export MYSQLC_MYSQLD_SERVER_ID
# 指定生成從庫特定配置
export MYSQLC_MYSQLD_replicate_ignore_db=mysql
export MYSQLC_MYSQLD_log_bin=mysql-bin
# 將從庫所需要的初始化腳本模版拷貝到指定目錄
cp -a /tmp/init-slave.sql /docker-entrypoint-initdb.d/
# 根據實例特定的環境變量,對初始化腳本模版進行更改
sed -i -r -e "s/MYSQL_ROOT_PASSWORD/${MYSQL_ROOT_PASSWORD}/g" \
-e "s/MYSQL_USER/${MYSQL_USER}/g" /docker-entrypoint-initdb.d/init-slave.sql
fi
關于腳本中通過環境變量生成指定配置,參考項目 env2file
制作鏡像的Dockerfile解析
FROM percona:5.7.23-stretch
LABEL creater="barnett"
ENV MYSQL_VERSION=5.7.23
ENV TZ=Asia/Shanghai
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list; \
rm -rf /etc/apt/sources.list.d/percona.list && apt-get update; \
apt-get install -y --no-install-recommends wget net-tools vim; \
rm -rf /var/lib/apt/lists/*; \
wget -O /usr/local/bin/env2file -q https://github.com/barnettZQG/env2file/releases/download/0.1.1/env2file-linux; \
chmod +x /usr/local/bin/env2file;
# 自定義啟動腳本
ADD docker-entrypoint.sh /run/docker-entrypoint.sh
# mysql官方啟動腳本
ADD ./run/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
ADD ./run/mysqld.cnf /etc/mysql/percona-server.conf.d/mysqld.cnf
# 拷貝slave初始化腳本模版到鏡像中,以備調用
ADD ./sql /tmp/
EXPOSE 3306
VOLUME ["/var/lib/mysql", "/var/log/mysql"]
ENV MYSQL_ROOT_PASSWORD=changeme
ENTRYPOINT [ "/run/docker-entrypoint.sh" ]
CMD [ "mysqld" ]
創建并配置mysql-master服務
創建mysql-master服務組件
代碼地址:https://github.com/goodrain-apps/percona-mysql.git?dir=5.7
代碼分支:cluster
通過Dockerfile創建服務 參考文檔 基于Dockerfile源碼創建服務
mysql-master服務 相關配置
開啟3306端口對內服務,并更改使用別名為MYSQL
配置關鍵環境變量
環境變量
值
說明
MYSQL_ROOT_PASSWORD
changeme(默認)自行指定
root密碼
MYSQL_USER
自行指定,如admin
mysql工作用戶
MYSQL_PASSWORD
自行指定
工作用戶密碼
MYSQL_DATABASE
自行指定
初始化生成數據庫
MYSQL_ROLE
master
指定角色
其中 除MYSQL_ROLE外,其他環境變量要在服務創建完成后,轉移到連接信息中去。
部署屬性中,修改應用類型為 有狀態應用
創建Slave服務
創建mysql-slave服務組件
創建方式同mysql-master服務組件一致。
mysql-slave服務 相關配置
區別于mysql-master服務組件,mysql-slave服務組件配置如下:
開啟3307端口對內服務,并更改使用別名為 MYSQL_SLAVE
配置環境變量
環境變量
值
說明
MYSQLC_MYSQLD_PORT
3307
mysql-slave監聽3307端口
mysql-slave服務依賴于mysql-master服務
mysql-slave服務組件,可以隨意擴容,腳本中寫好的邏輯會讓其自動向mysql-master注冊。
至此,一個基本的 MYSQL主從集群就已經搭建完成,如需要發布到應用市場供隨時下載使用,請參考應用分享與發布
讀寫分離
機制
MYSQL主從集群的一個好處就是,可以配置master庫負責寫入,slave庫負責查詢,slave自動從master同步數據的讀寫分離結構。
如果設置得當,這樣的結構可以大幅度提高數據庫性能的同時,降低主庫的壓力。
使用方法
如果用戶的業務程序已經支持讀寫分離,那么只需要設置:
數據庫寫入地址為mysql-master服務地址,如果使用Rainbond服務依賴,則可以用 ${MYSQL_HOST}:${MYSQL_PORT}的方式指定連接地址。
數據庫查詢地址為mysql-slave服務地址,如果使用Rainbond服務依賴,則可以用${MYSQL_SLAVE_HOST}:${MYSQL_SLAVE_PORT}的方式指定連接地址。
如果用戶的業務程序不支持讀寫分離,那么就要靠支持讀寫分離的中間件實現。
Atlas中間件
Atlas是由奇虎360開源的數據庫中間件,基于mysql官方提供的mysql-proxy改良而來。通過將mysql-proxy的LUA腳本,用C語言重新實現,Atlas提供了比mysql-proxy更強大的性能。經由中間件的代理,用戶只需要配置數據庫連接地址為 Atlas 服務地址,對于數據庫的寫入和查詢,則由 Atlas 來管理。
詳細了解Atlas
我們提供的docker化的Atlas組件,用戶可以直接基于Dockerfile源碼構建這個項目:
Atlas-docker項目地址
Rainbond已經發布的 Mysql主從集群 應用,已經集成了該中間件。
高階實現
當前架構缺點
目前搭建的 MYSQL主從集群,是一個master節點,對接多個slave節點。這樣的架構在小規模集群下沒有問題。但是如果集群規模很大、slave節點過多的時候,由master向所有slave節點同步數據這一過程將變成性能的瓶頸。
架構的優化
當用戶完全掌握了如何基于Rainbond搭建MYSQL主從集群后,可以自己嘗試,專門創建一個slave節點,作為數據同步節點使用。
該節點向上對接 master節點,來同步數據;向下對接slave集群,分發由master節點同步來的數據。
這樣做的好處是,master節點只需要對接一個數據同步節點來同步數據,可以更加專注于數據的寫入。其他slave節點從數據同步節點來同步數據。
如果有用戶實現了這種優化,歡迎將其分享到應用市場中,供更多的人來使用。
文章
關系型數據庫 · MySQL · atlas · 數據庫 · 容器
2019-08-06
總結
以上是生活随笔為你收集整理的mysql slave是什么_创建slave的搜索结果-阿里云开发者社区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的付费功能_MYSQL对游戏用
- 下一篇: mysql 2进制 安装_mysql二进