MYSQL8+CENTOS7.6 主從+keepalived搭建總結
一、環境準備
總共3個IP地址:2個物理機IP,1個VIP
MASTER:10.18.96.15
SLAVE: 10.18.96.16
VIP: 10.18.96.17
作業系統:CENTOS7.6
資料庫:MYSQL8.0.20
我的硬體資源是8核16G
MYSQL8下載地址:
wget
wget
wget
wget
wget
依賴下載地址:
(CMAKE如果使用YUM源安裝了CMAKE3,也可以不下載了)
二、依賴安裝
在安裝MYSQL8之前,得先有前置準備,否則就是各種報錯,無法安裝
1、GCC編譯安裝
yum -y install epel-release
yum -y group install "Development Tools"
mysql 依賴
yum -y install ncurses-devel openssl openssl-devel bison
yum install cmake3
2、安裝gcc 原始碼編譯依賴
## 先編譯gmp->mpfr->mpc
cd /usr/local/src/
編譯: gmp-6.1.2
tar -xvf /opt/gmp-6.1.2.tar.xz
cd gmp-6.1.2
./configure --prefix=/usr/local/gmp-6.1.2
make -j $(nproc)
make install
cd ../
編譯:mpfr-4.0.2
tar -xvf /opt/mpfr-4.0.2.tar.gz
cd mpfr-4.0.2
./configure --prefix=/usr/local/mpfr-4.0.2 --with-gmp=/usr/local/gmp-6.1.2
make -j $(nproc)
make install
cd ../
編譯:mpc-1.1.0
tar -xvf /opt/mpc-1.1.0.tar.gz
cd mpc-1.1.0
./configure --prefix=/usr/local/mpc-1.1.0 --with-mpfr=/usr/local/mpfr-4.0.2 --with-gmp=/usr/local/gmp-6.1.2
make -j $(nproc)
make install
# 把mpfr lib 加入 ld.so.conf 不然gcc 編譯報錯
echo /usr/local/mpfr-4.0.2/lib >> /etc/ld.so.conf
ldconfig
編譯安裝gcc
cd /usr/local/src/
tar -xvf /opt/gcc-9.2.0.tar.gz
cd gcc-9.2.0
./configure --prefix=/usr/local/gcc-9.2.0 \
-enable-threads=posix \
-disable-checking \
-disable-multilib \
-enable-languages=c,c++ \
--with-gmp=/usr/local/gmp-6.1.2 \
--with-mpfr=/usr/local/mpfr-4.0.2 \
--with-mpc=/usr/local/mpc-1.1.0 \
--with-tune=generic \
--with-arch_32=x86-64
make -j $(nproc)
make install -j $(nproc)
(友情提醒,我再make編譯GCC的時候,跑了1個多小時才跑完)
##備份舊 gcc 可執行檔案
mv /usr/bin/gcc /usr/bin/gcc.old
mv /usr/bin/g++ /usr/bin/g++.old
mv /usr/bin/c++ /usr/bin/c++.old
mv /usr/bin/cpp /usr/bin/cpp.old
mv /usr/bin/gcov /usr/bin/gcov.old
## 建立最新gcc 執行檔案軟鏈
ln -sf /usr/local/gcc-9.2.0/bin/* /usr/bin/
## 刪除lib64 目錄下.py 檔案不然ldconfig 報錯
cp /usr/local/gcc-9.2.0/lib64/libstdc++.so.6.0.27-gdb.py /opt/
rm -rf /usr/local/gcc-9.2.0/lib64/libstdc++.so.6.0.27-gdb.py
echo /usr/local/gcc-9.2.0/lib64 >> /etc/ld.so.conf
ldconfig
## 複製libstdc++.so.6.0.27 /lib64/
cp /usr/local/gcc-9.2.0/lib64/libstdc++.so.6.0.27 /lib64/
# 建立軟鏈 libstdc++.so.6
cd /lib64
ln -sf libstdc++.so.6.0.27 libstdc++.so.6
## 檢視是否最新版本
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
編譯安裝cmake cd /usr/local/src/(如果cmake用YUM源安裝過就不用下載安裝,我YUM安裝的2.8.12.2版本也能用)
tar -xvf /opt/cmake-3.15.2.tar.gz
cd /opt/cmake-3.15.2
./configure --prefix=/usr/local/cmake-3.15.2
gmake -j $(nproc)
gmake install -j $(nproc)
# 建立cmake 軟鏈
ln -sf /usr/local/cmake-3.15.2/bin/cmake /bin/cmake3
三、MYSQL8安裝
cd /opt/
tar xvf mysql-boost-8.0.20.tar.gz
cd /opt/mysql-8.0.20/
1、cmake
cmake3 \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
-DEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DEXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DCOMPILATION_COMMENT="nancy edition" \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/data/mysql/tmp \
-DMYSQL_UNIX_ADDR=/data/mysql/run/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DSYSCONFDIR=/data/mysql \
-DWITH_READLINE=1 \
-DFORCE_INSOURCE_BUILD=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DCMAKE_CXX_COMPILER=/usr/local/gcc-9.2.0/bin/g++ \
-DCMAKE_C_COMPILER=/usr/local/gcc-9.2.0/bin/gcc
注意:如果你的機器沒有聯網,需要自己下載一個包boost_1_70_0.tar.gz放到/data/mysql/tmp目錄下
下載地址:
2、編譯:
gmake -j $(nproc)
3、安裝:
gmake install -j $(nproc)
4、建立MYSQL使用者及相關目錄、授權
groupadd mysql
useradd mysql -g mysql -M -s /sbin/nologin
mkdir /data/mysql/data/
chown mysql.mysql /data/mysql/data/
mkdir /data/mysql/run
chown mysql.mysql /data/mysql/run
mkdir /data/mysql/binlog/
chown mysql.mysql /data/mysql/binlog/
chown -R mysql.mysql /data/mysql/
5、配置檔案(主庫)
vi /etc/my.cnf
[mysqld]
port = 3306
user = mysql
socket = /data/mysql/run/mysql.sock
pid_file = /data/mysql/mysqld.pid
basedir = /usr/local/mysql
datadir = /data/mysql/data
tmpdir = /data/mysql/tmp
open_files_limit = 65535
server_id = 1
#預設為0,0代表區分大小寫,1代表不區分大小寫,以小寫儲存,開發要求要區分大小寫
lower_case_table_names = 0
character_set_server = utf8mb4
# 允許最大連線數
max_connections = 6000
# 允許連線失敗的次數。這是為了防止有人從該主機試圖攻擊資料庫系統
max_connect_errors = 10
# 預設8小時。互動等待時間和非互動等待時間
# 建議300~500s,兩引數值必須一致,且同時修
interactive_timeout = 500
wait_timeout = 500
#短時間內的多少個請求可以被存在堆疊中
back_log=1024
default_storage_engine = InnoDB
#log_slave_updates = 1
#query_cache_size=1M
#*********** Logs related settings ***********
log_bin = /data/mysql/binlog/mysql-bin
log-bin-index=/data/mysql/binlog/mysql-bin.index
#binlog日誌過期時間設定,單位為秒,604800=7天
binlog_expire_logs_seconds=604800
log_bin_trust_function_creators=1
#最小400,對記憶體佔用影響大
#服務模式:從1400設定為400,記憶體從324M降到227M
#table_definition_cache=400
#最佳化引數,按事務刷盤,刷日誌 [0:最快模式,1:安全模式,2:比0安全但比0要慢]
innodb_flush_log_at_trx_commit=2
# 提交1次事務刷1次,可以為n
sync_binlog=1
# 預設使用“mysql_native_password”外掛認證
default_authentication_plugin=mysql_native_password
# 髒頁佔innodb_buffer_pool_size的比例時,觸發刷髒頁到磁碟
# 25%~50%
innodb_max_dirty_pages_pct=30
# 後臺程式最大IO效能指標
# 預設200,如果SSD,調整為5000~20000
innodb_io_capacity=200
# 預設10M。防止高併發下,資料庫受影響
innodb_data_file_path=ibdata1:1024M:autoextend
# 預設2,單位s。慢查詢時間,建議0.3-0.5
long_query_time=0.3
# 8.0預設row。記錄格式,讓資料安全可靠
binlog_format=row
# 預設8小時。互動等待時間和非互動等待時間
# 建議300~500s,兩引數值必須一致,且同時修改
interactive_timeout=500
wait_timeout=500
#日誌大小
innodb_log_file_size=256M
#日誌快取大小
innodb_log_buffer_size=12M
#這裡確認是否起用壓縮儲存功能
innodb_file_per_table=1
#決定壓縮程度的引數,如果你設定比較大,那麼壓縮比較多,耗費的CPU資源也較多;
#相反,如果設定較小的值,那麼CPU佔用少。預設值6,可以設定0-9#
innodb_compression_level=6
#指定在每個壓縮頁面可以作為空閒空間的最大比例,
#該引數僅僅應用在設定了innodb_compression_failure_threshold_pct不為零情況下,並且壓縮失敗率透過了中斷點。
#預設值50,可以設定範圍是0到75
innodb_compression_pad_pct_max=50
[mysqld_safe]
log-error=/data/mysql/data/csp-serverdb-1.err
[mysql]
# 設定mysql客戶端預設字符集
default-character-set=utf8mb4
[client]
# 設定mysql客戶端連線服務端時預設使用的埠
port=3306
default-character-set=utf8mb4
6、配置檔案(從庫)其實和主庫一樣的,就server_id改一下
7、 複製啟動檔案
cp /opt/mysql-8.0.20/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
8、 新增mysql 到環境變數
echo export PATH=$PATH:/usr/local/mysql/bin >>/etc/profiles
source /etc/profile
echo /usr/local/mysql/lib >> /etc/ld.so.conf
ldconfig
echo PATH=$PATH:/usr/local/mysql/bin ~/.bash_profile
source ~/.bash_profile
9、初始化
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
初始化後螢幕上會列印出來root使用者登入臨時隨機密碼
10、啟動
service mysqld start
或者
/etc/init.d/mysqld start
或者
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
不記得初始化密碼,可以在日誌中查詢
/data/mysql/data/serverdb-1.err
11、修改密碼:
alter user 'root'@'localhost' identified by '';
flush privileges;
(使用mysql -uroot -hlocalhost可本地免密登入,用於寫keepalived指令碼)
create user 'root'@'%' identified by '123456'
with
GRANT
OPTION;
grant all privileges on *.* to ' root '@'%';(建其他普通使用者也是差不多的套路,詳細增減許可權也可以在navicat操作)
ALTER user 'root'@'%' IDENTIFIED BY '123456'; (這個是修改)
flush privileges;
四、MYSQL主從配置
1、主庫
清除一下防火牆
iptables -F
setenforce 0
create user 'repl_user'@'%' identified by '123456';
flush privileges;
grant REPLICATION SLAVE on *.* to 'repl_user'@'%';
flush privileges;
master_log_file和master_log_pos透過在主庫上使用命令獲得:
show master status \G;
2、從庫
清除一下防火牆
iptables -F
setenforce 0
在從庫上執行:
change master to
master_host='10.18.96.15',
master_port=3306,
master_user='repl_user',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=156;
start slave;
show slave status\G;
五、keepalived搭建
1、安裝keepalived
cd /opt/
tar zxvf /opt/keepalived-1.4.2.tar.gz
cd /opt/keepalived-1.4.2
./configure
如果遇到以下報錯
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files.
解決方法:
yum -y install openssl-devel
2、編譯:
make
make install
3、複製配置檔案
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/sbin/keepalived /usr/sbin/
4、配置檔案
vi /etc/keepalived/keepalived.conf
global_defs {
router_id MySQL-HA2
}
vrrp_script check_run {
script "/etc/keepalived/mysql_check.sh"
interval 60
}
vrrp_sync_group VG2 {
group {
VI_1
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
track_script {
check_run
}
notify_master /etc/keepalived/master.sh
notify_stop /etc/keepalived/stop.sh
virtual_ipaddress {
10.18.96.17
}
}
從庫一樣的,就是priority 90 這裡改成90
5、自動切換指令碼,2個節點一樣的配置
(1)
vi /etc/keepalived/mysql_check.sh
#!/bin/bash
. ~/.bash_profile
count=1
while true
do
mysql -uroot -hlocalhost -e "show status;" > /dev/null 2>&1
i=$?
ps aux | grep mysqld | grep -v grep > /dev/null 2>&1
j=$?
if [ $i = 0 ] && [ $j = 0 ]
then
exit 0
else
if [ $i = 1 ] && [ $j = 0 ]
then
exit 0
else
if [ $count -gt 5 ]
then
break
fi
let count++
continue
fi
fi
done
/usr/bin/systemctl stop keepalived
(2)
vi /etc/keepalived/master.sh
#!/bin/bash
. /home/mysql/.bashrc
Master_Log_File=$(mysql -uroot -hlocalhost -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}')
Relay_Master_Log_File=$(mysql -uroot -hlocalhost -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}')
Read_Master_Log_Pos=$(mysql -uroot -hlocalhost -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}')
Exec_Master_Log_Pos=$(mysql -uroot -hlocalhost -e "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}')
i=1
while true
do
if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]
then
echo "ok"
break
else
sleep 1
if [ $i -gt 60 ]
then
break
fi
continue
let i++
fi
done
mysql -uroot -hlocalhost -e "stop slave;"
mysql -uroot -hlocalhost -e "reset slave all;"
mysql -uroot -hlocalhost -e "reset master;"
mysql -uroot -hlocalhost -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt
(3)
vi /etc/keepalived/stop.sh
#!/bin/bash
. ~/.bash_profile
M_File1=$(mysql -uroot -hlocalhost -e "show master status\G" | awk -F': ' '/File/{print $2}')
M_Position1=$(mysql -uroot -hlocalhost -e "show master status\G" | awk -F': ' '/Position/{print $2}')
sleep 1
M_File2=$(mysql -uroot -hlocalhost -e "show master status\G" | awk -F': ' '/File/{print $2}')
M_Position2=$(mysql -uroot -hlocalhost -e "show master status\G" | awk -F': ' '/Position/{print $2}')
i=1
while true
do
if [ $M_File1 = $M_File2 ] && [ $M_Position1 -eq $M_Position2 ]
then
echo "ok"
break
else
sleep 1
if [ $i -gt 60 ]
then
break
fi
continue
let i++
fi
done
然後確認MYSQL主從都已配置完成並啟動
啟動keepalived
systemctl start keepalived
下面這個是停止命令
systemctl stop keepalived
這樣就部署完成了,其他的測試啥的(什麼自動主備切換啊,VIP漂浮啊),自己搞就好了。
注意,如果是生產庫中,有多套keepalived的,virtual_router_id,group,instance之類的編組更換一下就好。
反正我都測過一遍,沒啥問題,很給力,總感覺自己寫的部落格會比別人的好用,適合自己的才是最好的,
大家也多總結總結,我是寫給自己以後看的,還會繼續完善。
如果是生產庫,注意一下root使用者授權
create user 'root'@'%' identified by '123456' with GRANT OPTION;
grant all privileges on *.* to ' root'@'%';
flush privileges;
還有一個問題就是,我安裝完MYSQL,發現記憶體16G全被吃完了,手動重新整理下快取
echo 1 > /proc/sys/vm/drop_caches
然後觀察一段時間,空閒記憶體沒有再被吃完。
基本這個時候可以交付給開發,然後搞搞壓力測試啥的,看看my.cnf配置的引數是否設定合理,不合理再進行調整,直至上線。
這安裝完了之後不是就不去理它了,要多關注專案進度和資料庫執行情況。
生產環境,記得新增引數設定北京時間東八區
default-time_zone='+8:00'
還有特殊SQL語法,group by用法
#group by 配置語法校驗
sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'
配置這個引數解決 上面 group by 不按所有列進行分組的功能(這樣配置,語法不會報錯,否則會報錯)
例子:
select a,b,c from test
group by a,b
上面的自動切換指令碼寫的太複雜,經檢驗,以下的指令碼會更好
5、自動切換指令碼,2個節點一樣的配置
cat chk_mysqld.sh
#!/bin/bash
pkill keepalived
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28371090/viewspace-2693226/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL主從配置及haproxy和keepalived搭建MySql
- nginx keepalived 主從切換Nginx
- MYSQL5.7.22 原始碼安裝 主從搭建 + KEEPALIVED高可用MySql原始碼
- keepalived配置redis主從切換Redis
- Redis主從複製原理總結Redis
- linux上mysql MM(雙主)及keepalived搭建LinuxMySql
- MySQL叢集搭建(6)-雙主+keepalived高可用MySql
- Redis主從搭建Redis
- mysql主從搭建MySql
- Haproxy+Keepalived高可用環境部署梳理(主主和主從模式)模式
- Nginx+keepalived 雙機熱備(主從模式)Nginx模式
- MYSQL5.6.40原始碼安裝 主從搭建 主主搭建MySql原始碼
- centos 搭建redis主從CentOSRedis
- MYSQL主從搭建5.6.38MySql
- mysqlxtrabackup線上搭建主從MySql
- Keepalived原理及配置應用總結
- Redis+Keepalived主從熱備秒級切換Redis
- Mysql 8.4.0 結合 Docker 搭建GTID主從複製,以及傳統主從複製MySqlDocker
- Docker 方式 MySQL 主從搭建DockerMySql
- mysql主從複製搭建MySql
- redis-cluster主從搭建Redis
- mysql主從搭建切換MySql
- mysql 5.7+keepalived主從切換步驟簡述MySql
- LVS+Keepalived 高可用環境部署記錄(主主和主從模式)模式
- Redis 結合 Docker 搭建哨兵+主從,並整合SpringBootRedisDockerSpring Boot
- MySQL(14)---Docker搭建MySQL主從複製(一主一從)MySqlDocker
- Keepalived+Mysql配置主主複製MySql
- Mysql+keepalived主主切換薦MySql
- MySQL高可用架構之Keepalived+主從架構部署MySql架構
- mysql雙主雙從 搭建配置MySql
- Redis主從同步叢集搭建Redis主從同步
- 新環境搭建Mysql主從MySql
- MYSQL主從複製的搭建MySql
- 邏輯複製主從搭建
- Mysql主從搭建(docker compose)MySqlDocker
- MySQL主從同步(一主一從、一主多從、主從從)等結構的概述與配置MySql主從同步
- linux虛擬機器環境快速搭建redis5.x版本的主從叢集總結Linux虛擬機Redis
- mysql讀寫分離實戰二-windows 上mysql主從資料庫搭建及問題總結MySqlWindows資料庫