MYSQL8+CENTOS7.6 主從+keepalived搭建總結

germany006發表於2020-05-20

一、環境準備

總共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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章