Mysql二进制安装及双主高可用部署

** MySQL官网:https://dev.mysql.com/downloads/mysql/**
到mysql官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (glibc 2.5) (x86, 64-bit),32位系统下载Linux - Generic (glibc 2.5) (x86, 32-bit)

版本根据需要自主选择

安装前准备:

1.先检查Linux中是否存在mysql rpm -qa|grep mysql
2:如果存在,请先执行卸载命令:rpm -e --nodeps mysql-libs --nodeps代表:可能其他地方有依赖mysql,这里强制卸载
3:检查各个mysql文件夹是否删除干净

find / -name mysql
结果如下:
/var/lib/mysql
/usr/local/mysql
/usr/lib/mysql
/usr/include/mysql
命令删除:
rm -fr /usr/lib/mysql
rm -fr /usr/include/mysql
注意:卸载后/var/lib/mysql中的数据及/etc/my.cnf不会删除,如果确定没用后就手工删除
rm -f /etc/my.cnf
rm -fr /var/lib/mysql
删除mysql用户及用户组
userdel mysql
groupdel mysql

4:纯净服务器则不需要

MySQL正式安装和相关设置(这里以mysql5.7.32为例)

1.创建压缩包目录
mkdir /data/soft
2.上传压缩包到linux
cd /data/soft
--下载安装包 
--建议:在windows上使用迅雷下载,速度很快(我的是1M/s),然后用工具(Xftp)上传到 /data/software
或者yum install -y lrzsz   rz命令直接拉   再或者在目录下;
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.32-linux-glibc2.5-x86_64.tar.gz

3.解压压缩包到目标位置
解压压缩包:
tar -xzvf /data/software/mysql-5.7.32-linux-glibc2.5-x86_64.tar.gz
--移动并修改文件名
mv /data/software/mysql-5.7.32-linux-glibc2.5-x86_64 /usr/local/mysql
4.创建数据仓库目录,存储文件
 mkdir /data/mysql         
5.创建用户及用户组
# 用户组
groupadd mysql
# 用户 (用户名/密码)
useradd -g mysql mysql
#授权
chown -R mysql.mysql /usr/local/mysql/或   chown -R mysql        chgrp -R mysql 
chown -R mysql /data/mysql/
5.初始化数据库
查看当前所在目录
pwd 若显示/usr/local/mysql-8.0,请继续执行,否则请先进入此目录/usr/local/mysql
初始化 注意查看是否存在相关目录,若不存在,请新建
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

此处需要注意记录生成的临时密码,上文结尾处的:YLi>7ecpe;YP 登录mysql要用到

Mysql配置

以下按需配置:
vim /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id = 1
#服务端口号 默认3306
port = 3306
#mysql安装根目录
basedir = /usr/local/mysql                             不是这个安装目录,则需要修改
#mysql数据文件所在位置
datadir = /data/mysql                                    不是这个存储目录,则需要修改
#pid
pid-file = /usr/local/mysql/mysql.pid
#设置socke文件所在目录
socket = /tmp/mysql.sock
#设置临时目录
tmpdir = /tmp
# 用户
user = mysql
# 允许访问的IP网段
bind-address = 0.0.0.0
# 跳过密码登录
#skip-grant-tables
#主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容
skip-external-locking
#只能用IP地址检查客户端的登录,不用主机名
skip_name_resolve = 1
#事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation = READ-COMMITTED
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
#最大连接数
max_connections = 400
#最大错误连接数
max_connect_errors = 1000
#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true
#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet = 128M
#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout = 1800
wait_timeout = 1800
#内部内存临时表的最大值 ,设置成128M。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size = 134217728
max_heap_table_size = 134217728
#禁用mysql的缓存查询结果集功能
#后期根据业务情况测试决定是否开启
#大部分情况下关闭下面两项
query_cache_size = 0
query_cache_type = 0
#数据库错误日志文件
log_error = /data/mysql/error.log                           不是这个存储目录,需要修改
#慢查询sql日志设置
slow_query_log = 1
slow_query_log_file = slow.log
#检查未使用到索引的sql
log_queries_not_using_indexes = 1
#针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
log_throttle_queries_not_using_indexes = 5
#作为从库时生效,从库复制中如何有慢sql也将被记录
log_slow_slave_statements = 1
#慢查询执行的秒数,必须达到此值可被记录
long_query_time = 8
#检索的行数必须达到此值才可被记为慢查询
min_examined_row_limit = 100
#mysql binlog日志文件保存的过期时间,过期后自动删除
expire_logs_days = 5

建立MySQL服务

cd /usr/local/mysql
chmod +x /etc/init.d/mysql 
chkconfig --add mysql
# 检查服务是否生效  
chkconfig --list mysql
pwd
/usr/local/mysql
cp -a ./support-files/mysql.server /etc/init.d/mysql

启动Mysql服务

systemctl start mysql
--登陆

mysql -hlocalhost -uroot -p
--如果出现:-bash: mysql: command not found
--就执行:  ln -s /usr/local/mysql/bin/mysql /usr/bin --没有出现就不用执行

系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,会找不到mysql的相关命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件,首先得知道mysql命令或mysqladmin命令的完整路径,比如mysql的路径是:/usr/local/mysql/bin/mysql,我们则可以这样执行命令ln -s /usr/local/mysql/bin/mysql /usr/bin

--输入第6步生成的临时密码

--修改密码

mysql> set password=password('要修改的密码');
# 如果想要所有主机都可访问,把localhost改成%
alter user 'root'@'localhost' identified with mysql_native_password by '密码';        只能在本地登录,
#设置root账户的host地址(修改了才可以远程连接)
mysql>grant all privileges on *.* to 'root'@'%' identified by '密码';                          可以远程
#这里表示赋予该用户所有数据库所有表(*.*表示所有表),%表示所有IP地址。
# 刷新
flush privileges;

开启mysql binlog 日志记录

binlog日志,即binary log,是二进制日志文件。它有两个作用,一是增量备份,即只备份新增的内容;二是用于主从复制等,即主节点维护了一个binlog日志文件,从节点从binlog中同步数据。我们可以通过binlog日志恢复数据。下面就介绍一下开启MySQL binlog日志的过程:

1、登录MySQL,查看binlog日志的状态
登录MySQL后,输入 ** show variables like '%log_bin%';**查看到binlog日志为OFF关闭状态;

image.png
image

2、开启MySQL binlog日志

使用vi编辑器修改MySQL的my.cnf配置文件

vim /etc/my.cnf
server_id=2
 #log日志文件存放位置
log_bin = /var/bin/mysql/mysql-bin 
binlog_format = ROW
expire_logs_days = 30
注意:每次服务器(数据库)重启,服务器会调用flush logs;,新创建一个binlog日志
进入上面配置的日志存储位置查看日志:
cd /data/mysql
ls
image.png
以上mysql安装已完成

下面开始MySQL高可用双主实现

系统 IP 主机名 服务
Centos 7.6 192.168.100.2 mysql1 MySQL+keepalived
Centos 7.6 192.168.100.3 mysql2 MySQL+keepalived

开启二进制日志及中继日志

主机mysql1配置文件如下:
[root@mysql1 ~]# cat /etc/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
port=3306
server_id=1          #server_id必须唯一
socket=/tmp/mysql.sock
log-error=/data/mysql/error.log
log-bin=/data/mysql/log_bin            #指定二进制日志文件
relay-log=/data/mysql/relay-bin        #指定中继日志
relay-log-index=relay-bin.index
auto_increment_increment=2
auto_increment_offset=1
 
######主机mysql2配置文件如下:
[root@mysql2 ~]# cat /etc/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
server_id=2 
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin=/usr/local/mysql/data/log_bin
relay-log=/usr/local/mysql/data/relay-bin
relay-log-index=relay-bin.index
auto_increment_increment=2
auto_increment_offset=2

注:mysql1和mysql2只有server-id和auto_increment_offset不同
mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。 auto-increment-increment表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数,我这里用到两台服务器,所以值设为2。 auto-increment-offset是用来设定数据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突。
注:可以在my.cnf文件中添加“binlog_do_db=数据库名”配置项(可以添加多个)来指定要同步的数据库

3、将mysql2设置为mysql1的从服务器

1)mysql1上创建授权用户

[root@mysql1 ~]# mysql -uroot -p123.com
mysql> grant replication slave on *.* to rep@'192.168.20.%' identified by '123.com'; 

2)查看mysql1的当前binlog状态信息

mysql> show master status\G
*************************** 1. row ***************************
             File: log_bin.000001     这个值会用到
         Position: 609         这个值会用到
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

3)在mysql2上指定mysql1为master,并开启slave功能

#指定master地址
mysql> change master to master_host='192.168.100.2',
    -> master_user='rep',
    -> master_password='123.com',
    -> master_log_file='log_bin.000001',    #必须和master上查看到的名字一样
    -> master_log_pos=609;      #同上,这个值也是在master上查看到的
#启动slave功能
mysql> start slave;
#确定配置成功
mysql> show slave status\G            #查看slave状态
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.100.2
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: log_bin.000001
          Read_Master_Log_Pos: 609
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 318
        Relay_Master_Log_File: log_bin.000001
             Slave_IO_Running: Yes               这个值必须为Yes
            Slave_SQL_Running: Yes             这个值也必须为Yes
只要上面两个值为yes,则表示主从没有问题,
#其中,IO线程是去master上面读取二进制日志到本地的中继日志中;
#SQL线程是将本地的中继日志中的内容转换为sql语句并执行。

4、将mysql1设置为mysql2的从服务器

#主机mysql2上操作如下:
mysql> grant replication slave on *.* to rep@'192.168.100.%' identified by '123.com';
mysql> flush privileges;
mysql> show master status\G          #获取所需的file和Position
*************************** 1. row ***************************
             File: log_bin.000002
         Position: 609
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

#主机mysql1上操作如下:
#指定mysql2为master
mysql> change master to master_host='192.168.100.3',
    -> master_user='rep',
    -> master_password='123.com',
    -> master_log_file='log_bin.000002',
    -> master_log_pos=609;
mysql> start slave;       #启动slave
mysql> show slave status\G          #查看slave状态
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.100.3
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: log_bin.000002
          Read_Master_Log_Pos: 609
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 318
        Relay_Master_Log_File: log_bin.000002
                #确保下面两个值为yes
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

5、测试主主同步

1)主机mysql1创建测试数据


mysql> create database test;
mysql> use test
mysql> create table test1(id int,name varchar(4));
mysql> insert into t1 values(1,'a'),(2,'b');
#确认mysql1的数据
mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
2 rows in set (0.00 sec)

2)确认mysql2已经同步并插入新的数据

#以下操作在主机mysql2上进行
mysql> select * from test1;        #确定数据已同步
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
#插入数据测试
mysql> insert into test1 values(3,'c'),(4,'d');
mysql> select * from test1;        #确定最新数据
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
+------+------+

3)确定mysql1可以同步mysql2的数据

#在mysql1上查询,是否同步mysql2主机上的数据
mysql> select * from test1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
+------+------+
4 rows in set (0.00 sec)

至此,现在任何一台MySQL上更新数据都会同步到另一台MySQL,MySQL同步完成。

注:若主MySQL服务器已经存在,只是后期业务拓展才搭建从服务器,在配置数据库同步前应先将MySQL服务器的要同步的数据库拷贝到从服务器上(如先在主MySQL上备份数据库,再用备份再从MySQL服务器上恢复)。

配置keepalived高可用

1、安装keepalived

两个节点都需要执行以下命令,以便安装keepalived。

[root@mysql1 ~]# yum -y install keepalived

2、修改主机mysql1的keepalived配置文件

[root@mysql1 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id mysql-1      #此处的值必须唯一
}

vrrp_instance VI_1 {
    state BACKUP       #指定角色为backup,两台MySQL服务器的角色均为backup,设置backup将根据优先级决定主从

    interface ens33      #指定承载虚拟IP的网卡
    virtual_router_id 51         #指定组,同一个集群内的值必须一致。并且不可和局域网中的其他组冲突
    priority 100          #优先级范围为:0~100
    advert_int 1     #发vrrp包的时间间隔,即多久进行一次master选举(可认为是健康检查时间间隔)
    nopreempt             #不抢占,即允许一个priority比较低的节点作为master,     
    authentication {          #认证区域
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         #VIP区域,指定vip地址
        192.168.100.20
    }
}

virtual_server 192.168.100.100 3306 {    #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 2         #设置运行情况检查时间,单位是秒
    lb_algo rr      #设置后端调度算法
    lb_kind DR    #设置lvs实现负载均衡的机制,有NAT、TUN、DR三个模式,DR模式效率最高
    persistence_timeout 60     #会话保持时间,单位是秒
    protocol TCP     #指定转发协议类型,有TCP和UDP两种

    real_server 192.168.100.2 3306 {          #配置服务节点,这里指定的也就是本机的真实IP
        weight 1     #设置权重
    notify_down /etc/keepalived/bin/mysql.sh    #检测到real_server的MySQL服务宕机后执行的脚本。
    TCP_CHECK {
        connect_port 3306    #健康检查端口
        connect_timeout 3       #连接超时时间
        retry 3    #重试次数
        delay_before_retry 3      #重连间隔时间
     }
   }
}
#准备指定的脚本
[root@mysql01 keepalived]# pwd
/etc/keepalived
[root@mysql01 keepalived]# mkdir bin
[root@mysql01 keepalived]# vim bin/mysql.sh
#!/bin/bash
pkill keepalived    #停止keepalived服务
[root@mysql01 keepalived]# chmod +x bin/mysql.sh    #赋予脚本执行权限
[root@mysql01 ~]# systemctl start keepalived        #启动keepalived服务

3、确定ens33网卡有虚拟Ip

[root@mysql01 ~]# ip a show ens33 #必须使用ip a命令才可以查看到,ifconfig命令查看不到
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c0:39:80 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.2/24 brd 192.168.20.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.20.20/32 scope global ens33 #可以看到指定的VIP已经绑定到ens33上
valid_lft forever preferred_lft forever
inet6 fe80::659e:9312:318a:e52b/64 scope link noprefixroute
valid_lft forever preferred_lft forever

将keepalived的配置文件发送到mysql2主机上

[root@mysql01 ~]# scp /etc/keepalived/keepalived.conf root@192.168.100.3:/etc/keepalived/

4、修改主机mysql2的keepalived配置文件

#修改msyql1发送来的配置文件
[root@mysql02 keepalived]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id mysql-2         #更改router_id,此处在热备组中必须要唯一
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90             #更改优先级
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.20
    }
}

virtual_server 192.168.100.20 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    persistence_timeout 60
    protocol TCP

    real_server 192.168.100.3 3306 {        #更改为本机的IP地址及监听端口
        weight 1
    notify_down /etc/keepalived/bin/mysql.sh
    TCP_CHECK {
        connect_port 3306
        connect_timeout 3
        retry 3
        delay_before_retry 3
     }
   }
}
#准备所需脚本
[root@mysql1 keepalived]# pwd
/etc/keepalived
[root@mysql2 keepalived]# mkdir bin
[root@mysql2 keepalived]# vim bin/mysql.sh
#!/bin/bash
pkill keepalived
[root@mysql2 keepalived]# chmod +x bin/mysql.sh 
#启动keepalived
[root@mysql2 ~]# systemctl start keepalived 

三 最终总结

至此,即可实现MySQL的双主效果(只要VIP所在的节点,MySQL服务端口无法连接,
 那么VIP将切换至另一台节点,即使宕机的mysql服务器恢复,也不会对VIP进行抢占)。
 虽然有两台MySQL数据库,但是其使用keepalived提供的虚拟IP地址来对外提供服务,
 不管这个虚拟Ip地址落在哪台服务器上,
 都可以保证数据的一致性,因为它们互为主从,
 并且keepalived的状态都为backup,
 也设置了不抢占(减少VIP的切换次数),
 这样可以大大的避免keepalived的脑裂问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335