1、单节点搭建
1.1 准备
需要的软件:ssh客户端,filezilla,centos7,mqsql5.6
$ mkdir sfm # 在根目录下创建自己的文件夹
使用FTP上传MySQL5.6二进制文件下载地址到sfm文件夹下。
1.2 添加用户和组
$ groupadd mysql
$ useradd -g mysql mysql
1.3 mysql安装包解压
$ cd sfm/
$ ll # 查看数据库文件
-rw-r--r--. 1 root root 343082156 11月 3 17:07 mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz
$ tar -xvf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz # 解压
$ mv mysql-5.6.48-linux-glibc2.12-x86_64 mysql # 重命名
$ cd /sfm/mysql
$ chown -R mysql . # 指定文件的拥有者改为指定的用户或组
$ chgrp -R mysql .
1.4 安装 autoconf
在线安装:
$ yum -y install autoconf
离线安装:
# 参考第四节
1.5 安装MySQL
1.5.1 安装
$ /sfm/mysql/scripts/mysql_install_db --user=mysql --basedir=/sfm/mysql --datadir=/sfm/mysql/data
1.5.2 复制配置文件
$ cp /sfm/mysql/support-files/my-default.cnf /etc/my.cnf
1.5.3 修改配置文件
$ vim /etc/my.cnf
[client]
port = 3306
socket = /sfm/mysql/mysql.sock
default-character-set = utf8
[mysqld]
skip-name-resolve
user = mysql
basedir = /sfm/mysql
datadir = /sfm/mysql/data
port = 3306
server_id = 10
socket = /sfm/mysql/mysql.sock
pid-file = /sfm/mysql/mysql.pid
log-error = /sfm/mysql/data/mysql.err
log-bin = /sfm/mysql/data/mysql-bin
character-set-server = utf8
1.5.4 设置系统服务
$ cp /sfm/mysql/support-files/mysql.server /etc/init.d/mysqld
$ vim /etc/init.d/mysqld
# 将所有/user/local 路径改为 /sfm
1.5.5 配置环境变量
$ echo 'export PATH=/sfm/mysql/bin:$PATH' >> /etc/profile
$ source /etc/profile
1.6 启动测试
1.6.1 启动
$ service mysqld start
1.6.2 修改mysql密码
$ mysqladmin -u root password '123456'
提示:如果后面开启远程连接,请把密码设置复杂一点。很重要!!!!!!!!!!!!!!!
1.6.3 登陆mysql
$ mysql -uroot -p
[root@localhost /]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.42-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
$ mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
1.6.4 配置远程连接
慎重开启,如果处于公网环境,强烈建议不开启。
> use mysql;
> update user set Host='%' where user ='root' limit 1;
select Host,user,password from user where User='root';
update user set Host='%' where user ='root' and Host='localhost';
delete from user where Host='localhost' and User='';
> flush privileges;
> exit
$ service mysqld restart
防火墙放行:
$ systemctl start firewalld # 启动friewall
$ systemctl status firewalld # 查看firewall启动情况
$ firewall-cmd --zone=public --add-port=3306/tcp --permanent # 开启3306端口
$ firewall-cmd --reload # 重启
$ firewall-cmd --query-port=3306/tcp # 查看3306端口是否开启
1.6.5 开机启动配置
$ touch /usr/lib/systemd/system/mysql.service
$ vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=MySQ
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/sfm/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#Restart=on-failure
#RestartPreventExitStatus=1
#PrivateTmp=false
$ systemctl start mysql
$ systemctl enable mysql # 开启开机启动
2、主从MySQL主从集群搭建
前一台主机IP地址为:192.168.1.104,作位主机master
另外在新建一台主机:192.168.1.102,作位从机slave
2.1 开启master上的log-bin功能:
# 192.168.1.104 操作
$ cat /etc/my.cn
# 输出
---
server_id = 10
log-bin = /usr/local/mysql/data/mysql-bin
----
代表已经开启log-bin功能
登陆mysql在master服务器上建立账户,并授权slave功能
$ mysql -uroot -p
> grant replication slave on *.* to 'mysql'@'%' identified by 'mysql';
> flush privileges;
> show master status;
# 输出
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000035 | 180708 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 主库上当前的二进制日志名和偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复.
2.2 从库操作
2.2.1 修改从数据库的配置文件
注意 server-id的值必须是唯一的,不能和主数据库的配置相同,如果有多个从数据库服务器,每个从数据库服务器必须有自己唯一的 server-id值。
$ vim /etc/my.cnf
# 修改如下:server_id必须唯一
server_id = 11
# 重启服务
$ serivce mysqld restart
2.2.2 开启复制
MASTER_HOST:主机IP
MASTER_PORT:主机端口
MASTER_USER:主机用户
MASTER_PASSWORD:主机密码
MASTER_LOG_FILE:主机的日志文件
MASTER_LOG_POS:偏移量。如果输入1,全部复制,有可能密码也会被复制过来。
$ mysql -uroot -p
> CHANGE MASTER TO MASTER_HOST='192.168.1.104',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='youxuan' ,MASTER_LOG_FILE='mysql-bin.000035',MASTER_LOG_POS=180708;
> start slave; # 开启复制
> show processlist\G; # 命令将显示类似如下的进程:
*************************** 1. row ***************************
Id: 1
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: show processlist
*************************** 2. row ***************************
Id: 4
User: root
Host: 192.168.1.109:63170
db: sfm
Command: Sleep
Time: 332
State:
Info: NULL
*************************** 3. row ***************************
Id: 5
User: root
Host: 192.168.1.109:63173
db: sfm
Command: Sleep
Time: 355
State:
Info: NULL
*************************** 4. row ***************************
Id: 6
User: system user
Host:
db: NULL
Command: Connect
Time: 457
State: Waiting for master to send event
Info: NULL
*************************** 5. row ***************************
Id: 7
User: system user
Host:
db: NULL
Command: Connect
Time: 317
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
5 rows in set (0.00 sec)
ERROR:
No query specified
在主机上修改下数据查看数据库也会被同步更新。
> stop slave # 停止复制
3、主从MySQL双主集群搭建
之前的采取的主从结构:
主机IP地址为:192.168.1.104,作位主机master
新建一台主机:192.168.1.102,作位从机slave
想要实现的结构:
主机IP地址为:192.168.1.104,作位主机master1,slave2
新建一台主机:192.168.1.102,作位从机slave1,master2
在192.168.1.102(作为master2)执行以下操作:
# 进入Mysql交互式环境
$ mysql -uroot -p
> grant replication slave on *.* to 'mysql'@'%' identified by 'mysql'; # 授权
> flush privileges;
> show master status; # 查看主机master2状态
#输出
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000020 | 372 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
在192.168.1.104(作为slave2)执行以下操作:
$ mysql -uroot -p
> CHANGE MASTER TO MASTER_HOST='192.168.1.102',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='youxuan' ,MASTER_LOG_FILE='mysql-bin.000020',MASTER_LOG_POS=372;
> start slave # 开启复制
> show processlist\G # 命令将显示类似如下的进程:
双主结构同步完成。
4、配置MySQL+keepalived 高可用环境
利用keepalived实现mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,我们必须保证两台mysql数据库的数据完全一致,实现方法是两台mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台mysql数据库宕机后,应用能够自动切换到另外一台mysql数据库上去,保证系统的高可用。
4.1 安装Keepalived
4.1.1 依赖包安装
在线安装:
$ yum install -y gcc openssl-devel popt-devel
离线安装:
确保有一台电脑可以连接互联网
-
执行指令,其中xxx是你要安装的软件名,根据需要自行修改。/tmp/rpm是下载后保存的路径,也可以选其它路径存放下载的安装包文件:
$ yum install -y gcc openssl-devel popt-devel --downloadonly --downloaddir /tmp/rpm
如果下载正常,下载完成后就可以在本机/tmp/rpm路径下找到安装包。
分发rpm包到其它机器
-
进入/tmp/rpm路径下,执行指令
$ rpm -ivh *.rpm --force --nodeps
通过以上步骤即可离线安装软件。
4.1.2 下载编译Keepalived和killall
Keepalived,对外统一提供虚IP,并且可以自动切换。killall主要是监听数据库端口的功能。
在线安装:
$ yum install -y keepalived
$ yum install -y psmisc.x86_64
离线安装:参看上面的
4.2 Keepalived配置
4.2.1 配置文件修改
先查看网卡:
$ ip addr
# 输出如下
[root@localhost ~]# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 2c:f0:5d:19:aa:1e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute dynamic eno1
valid_lft 6375sec preferred_lft 6375sec
inet6 fe80::4ede:da95:8fd4:f89c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:19:d9:8c:f8 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
其中,第二项为服务器的网卡名 eno1
其中virtual_ipaddress
为提供外部访问的IP地址,这里使用192.168.1.111
,必须保持两台机器virtual_ipaddress
相同。
修改192.168.1.102(master1)配置文件:
操作如下:
$ vim /etc/keepalived/keepalived.conf
配置如下:
# 全局配置 不用动 只需注释掉vrrp_strict
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1 # 邮件服务器,暂时没用到,随便填
smtp_connect_timeout 30
router_id LVS_DEVEL # 两台服务器必须唯一
vrrp_skip_check_adv_addr
#必须注释掉 否则报错
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查mysql服务是否存活的脚本
vrrp_script chk_mysql {
script "/usr/bin/killall -0 mysqld"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
# 状态:MASTER 另外一台机器为BACKUP
state MASTER
# 绑定的网卡
interface eno1
# 虚拟路由id 两台机器需保持一致
virtual_router_id 51
# 优先级 MASTER的值要大于BACKUP
priority 100 # MASTER节点高于BACKUP节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址 两台keepalived需要一致
virtual_ipaddress {
192.168.1.111 # 向外提供的IP,两台机器相同
}
# 检查脚本 vrrp_script的名字
track_script {
chk_mysql
}
}
###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的 这里用不到
###
修改192.168.1.104(master2)配置文件:
查看网卡:eno1
# 全局配置 不用动 只需注释掉vrrp_strict
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1 # 邮件服务器,暂时用到,随便填
smtp_connect_timeout 30
router_id LVS_DEVEL # 两台服务器必须唯一
vrrp_skip_check_adv_addr
#必须注释掉 否则报错
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检查mysql服务是否存活的脚本
vrrp_script chk_mysql {
script "/usr/bin/killall -0 mysqld"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
# 状态:MASTER 另外一台机器为BACKUP
state BACKUP
# 绑定的网卡
interface eno1
# 虚拟路由id 两台机器需保持一致
virtual_router_id 51
# 优先级 MASTER的值要大于BACKUP
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址 两台keepalived需要一致
virtual_ipaddress {
192.168.1.111 # 向外提供的IP,两台机器相同
}
# 检查脚本 vrrp_script的名字
track_script {
chk_mysql
}
}
###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的 这里用不到
###
killall命令脚本。
killall -0
并不是杀掉进程,而是检查进程是否存在,如果存在则返回0,如果不存在则返回1。当返回1时,keepalived就会切换主备状态。
4.2.2 启动keepalived
关闭防火墙或者开启组播:选择其中一项执行到两台服务器
关闭防火墙:
$ sudo systemctl stop firewalld # 临时关闭
$ sudo systemctl disable firewalld # 永久关闭
$ sudo systemctl status firewalld # 查看防火墙状态。
开启组播:
$ firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;
$ firewall-cmd --reload;
eno1 为服务器网卡名称 使用命令 ip addr 查看,224.0.0.18为默认组播地址。
开启keepalived:
# 两台机器同时开启
$ service keepalived start
# 查看开启状态
$ service keepalived status
使用ip addr
查看是否生成虚拟IP:192.168.1.111
[root@localhost keepalived]# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 2c:f0:5d:19:aa:31 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute dynamic eno1
valid_lft 4957sec preferred_lft 4957sec
inet 192.168.1.111/32 scope global eno1
valid_lft forever preferred_lft forever
inet6 fe80::bb62:4fd:d2f3:ac81/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:5c:7a:b1:08 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
成功开启
4.3 测试MySQL高可用
# master1 关闭mysqld服务 查看master1和maste2的ip地址
$ service mysqld stop
$ ip addr
# 正确的情况是:
# master1机器虚拟ip消失,master2机器出现虚拟ip
# master1 开启mysqld服务 查看master1和maste2的ip地址
$ service mysqld start
$ ip addr
# 正确的情况是:
# master1机器出现虚拟ip, master2机器虚拟ip消失
1、# master1和master2同时关闭mysqld服务 查看master1和maste2的ip地址
$ service mysqld stop # master1机器操作
$ service mysqld stop # master2机器操作
$ ip addr
# 正确的情况是:
# master1和master2机器虚拟ip消失
2、# 开启master2的mysqld服务
$ service mysqld start # master2机器操作
$ ip addr # master2机器操作
# 正确的情况是:
# master2机器虚拟ip出现
3、# 开启master1的mysqld服务
$ service mysqld start # master1机器操作
$ ip addr
# 正确的情况是:
# master1机器出现虚拟ip, master2机器虚拟ip消失
MySQL高可用环境搭建完成。