Linux服务器安装JavaWeb环境(二) Redis,MySql,Zookeeper,Keepalive

11 篇文章 5 订阅
5 篇文章 0 订阅

/*****************【安装RedisServer】****************/

第一步:下载redis安装包

Index of /releases/

去这个地址下载,我下载的是redis-4.0.6.tar.gz版本

新建文件夹

mkdir /usr/local/redis

上传压缩包

rz

第二步:解压压缩包

tar -zxvf redis-4.0.6.tar.gz

[root@iZwz991stxdwj560bfmadtZ local]# tar -zxvf redis-4.0.6.tar.gz

第三步:yum安装gcc依赖

yum install gcc

[root@iZwz991stxdwj560bfmadtZ local]# yum install gcc

遇到选择,输入y即可

第四步:修改文件夹名称并跳转到redis解压目录下

[root@rocketmq-nameserver1 local]# mv redis-4.0.6/ redis
[root@iZwz991stxdwj560bfmadtZ local]# cd redis

第五步:编译安装

编译

root@rocketmq-nameserver1 redis]# make

输入命令make执行编译命令,接下来控制台会输出各种编译过程中输出的内容。

最终运行结果如下:

 

 安装

输入以下命令

[root@rocketmq-nameserver1 redis]# make PREFIX=/usr/local/redis install

这里多了一个关键字 PREFIX= 这个关键字的作用是编译的时候用于指定程序存放的路径。比如我们现在就是指定了redis必须存放在/usr/local/redis目录。假设不添加该关键字Linux会将可执行文件存放在/usr/local/bin目录,

库文件会存放在/usr/local/lib目录。配置文件会存放在/usr/local/etc目录。其他的资源文件会存放在usr/local/share目录。这里指定号目录也方便后续的卸载,后续直接rm -rf /usr/local/redis 即可删除redis。

执行结果如下图:

二、启动redis的三种方式

先切换到redis src目录下

[root@iZwz991stxdwj560bfmadtZ redis-4.0.6]# cd src

1、直接启动redis

./redis-server

[root@iZwz991stxdwj560bfmadtZ src]# ./redis-server
18685:C 13 Dec 12:56:12.507 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18685:C 13 Dec 12:56:12.507 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=18685, just started
18685:C 13 Dec 12:56:12.507 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 18685
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

18685:M 13 Dec 12:56:12.508 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
18685:M 13 Dec 12:56:12.508 # Server initialized
18685:M 13 Dec 12:56:12.508 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
18685:M 13 Dec 12:56:12.508 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
18685:M 13 Dec 12:56:12.508 * Ready to accept connections  

如上图:redis启动成功,但是这种启动方式需要一直打开窗口,不能进行其他操作,不太方便。

按 ctrl + c可以关闭窗口。

  

2、以后台进程方式启动redis

第一步:修改redis.conf文件,修改该配置后表示开启守护进程模式,redis能够在后台运行

[root@rocketmq-nameserver1 redis]# vim redis.conf 

两个地方需要修改:

1.daemonize 配置 no 改为 yes(redis能够在后台运行)

2.bind 127.0.0.1 改为 0.0.0.0 或者 直接注释,这样放开客户端对服务端的链接 (集群模式下多台服务器之间能互相通讯

3.protected-mode  配置 yes  改为 no 

4.requirepass 配置 取消注释 改为 requirepass 你的密码

第二步:切换到src目录,指定redis.conf文件启动

[root@rocketmq-nameserver1 redis]# cd src
[root@rocketmq-nameserver1 src]# ./redis-server /usr/local/redis/redis.conf 

2.2 链接客户端

./redis-cli --raw

-- raw 是防止中文乱码

auth 123456 验证密码,登录了并不等于成功验证了身份

输入ping  回应pong 就是成功了 

2.3 关闭redis 服务

不建议适用kill -9 来结束进程,可能发生未知的问题

(1)先链接客户端

(2) shutdown save 

  • SAVE 参数表示在关闭服务器之前,将执行 SAVE 命令进行持久化保存。
  • NOSAVE 参数表示在关闭服务器之前,不会执行 SAVE 命令进行持久化保存。

为什么关闭服务需要通过链接客户端?因为需要验证密码,加强了安全性

3、设置redis开机自启动

1.切换到/etc/init.d文件夹下面,然后将启动脚本复制一份到该文件夹下面

[root@rocketmq-nameserver1 etc]# cd /etc/init.d
[root@rocketmq-nameserver1 init.d]# cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis


2.修改reids开机自启脚本

[root@rocketmq-nameserver1 init.d]# vi redis 

需要修改的几个地方:

               2.1.在第一行./bin/sh下面加入如下两行注释,注释的意思是,redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。

# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database

                2.2. 修改配置文件路径

#!/bin/sh
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/redis.conf"

3.执行开机自启命令

[root@iZwz991stxdwj560bfmadtZ init.d]# chkconfig --add redis
[root@iZwz991stxdwj560bfmadtZ init.d]# chkconfig redis on

现在可以直接已服务的形式启动和关闭redis了

/*****************【安装哨兵模式-RedisServer】****************/

1、架构图

2、服务器列表

3、搭建主从模式

①、主要配置项

主服务器(上图的Node1)配置文件 redis.config 主要配置项:

#配置端口
port 6379
#以守护进程模式启动
daemonize yes
#pid的存放文件
pidfile /var/run/redis_6379.pid
#日志文件名
logfile "redis_6379.log"
#存放备份文件以及日志等文件的目录
dir "/opt/redis/data"

从服务器配置文件主要配置项基本和主服务器保持一致,需要修改端口 port ;另外存放位置和日志文件名也可以根据需要修改.

为了表示主从关系,还需要在从服务器配置文件中添加一行重要配置:

#配置主服务器IP,端口
slaveof 192.168.14.101 6379

②、验证主从关系

配置完成后,我们通过 redis-server redis.conf 命令启动Redis.然后通过 redis-cli -p 端口 分别进入到各台服务器的控制行页面:

输入如下命令:

info replication

三台服务器打印结果如下:

  由上图可以看到,Node1 服务器作为主服务器,节点角色是 master,另外的两台从服务器,节点角色都是 slave.

另外还可以进行如下测试:可以在主服务器上添加一条数据,然后看看从服务器上是否能够查到该数据.

③、问题

如果对于上面的测试,主服务器上添加的数据,从服务器上无法查询到,可以查看前面配置的目录/opt/redis/data 日志文件,有一种错误如下:

  这是由于主服务器设置了登录密码,从服务器在向主服务器进行数据同步复制时,由于不知道主服务器密码,导致连接不上,从而无法进行同步.

解决这个问题,需要明确两个配置:

一.requreipass

设置redis的登录密码.

二.masterauth

针对master对应的slave节点设置的,在slave节点数据同步的时候用到。

建议,如果启用Redis密码校验,最好将各个节点的masterauth和requirepass设置为相同的密码;如果不设置为相同的,要注意slave节点masterauth和master节点requirepass的对应关系.

4、搭建哨兵模式

①、主要配置项

配置文件名称为:sentinel.conf

#配置端口
port 26379
#以守护进程模式启动
daemonize yes
#日志文件名
logfile "sentinel_26379.log"
#存放备份文件以及日志等文件的目录
dir "/opt/redis/data" 
#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个
sentinel monitor mymaster 192.168.14.101 6379 2
#30秒ping不通主节点的信息,主观认为master宕机
sentinel down-after-milliseconds mymaster 30000
#故障转移后重新主从复制,1表示串行,>1并行
sentinel parallel-syncs mymaster 1
#故障转移开始,三分钟内没有完成,则认为转移失败
sentinel failover-timeout mymaster 180000

注意三台服务器的端口配置.如果redis服务器配置了密码连接,则要增加如下配置:

sentinel auth-pass mymaster 123

后面的123表示密码.注意这行配置要配置到 sentinel monitor mymaster ip port 后面,因为名称 mymaster要先定义.

②、启动哨兵

redis-sentinel sentinel.conf

③、验证主从自动切换

首先kill掉Redis 主节点.然后查看sentinel 日志:

  上面截图红框框住的几个重要信息,这里先介绍最后一行,switch-master mymaster 192.168.14.101 6379 192.168.14.103 6381 表示master服务器将由6379的redis服务切换为6381端口的redis服务器.

PS:+switch-master 表示切换主节点.

然后我们通过 info replication 命令查看 6381的redis服务器:

  我们发现,6381的Redis服务已经切换成master节点了.

另外,也可以查看sentinel.conf 配置文件,里面的 sentinel monitor mymaster 192.168.14.101 6379 2 也自动更改为 sentinel monitor mymaster 192.168.14.103 6381 2 配置了.

5、Java客户端连接哨兵集群

这里通过springboot项目来连接,代码地址如下:

https://github.com/YSOcean/redis-sentinel.git
  这里贴一下主要测试代码:

PS:实际上springboot已经为我们注入了RedisTemplate,我们在实际项目中不用写的像下面代码这么麻烦,这样写是为了详细的表明连接步骤.

//1.设置sentinel 各个节点集合
Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("192.168.14.101:26379");
sentinelSet.add("192.168.14.102:26380");
sentinelSet.add("192.168.14.103:26381");

//2.设置jedispool 连接池配置文件
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);
config.setMaxWaitMillis(1000);

//3.设置mastername,sentinelNode集合,配置文件,Redis登录密码
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",sentinelSet,config,"123");
Jedis jedis = null;
try {
    jedis = jedisSentinelPool.getResource();
    //获取Redis中key=hello的值
    String value = jedis.get("hello");
    System.out.println(value);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(jedis != null){
        jedis.close();
    }
}

6、Java客户端连接原理

①、结构图

②、连接步骤

一.客户端遍历所有的 Sentinel 节点集合,获取一个可用的 Sentinel 节点.

二.客户端向可用的 Sentinel 节点发送 get-master-addr-by-name 命令,获取Redis Master 节点.

三.客户端向Redis Master节点发送role或role replication 命令,来确定其是否是Master节点,并且能够获取其 slave节点信息.

四.客户端获取到确定的节点信息后,便可以向Redis发送命令来进行后续操作了

需要注意的是:客户端是和Sentinel来进行交互的,通过Sentinel来获取真正的Redis节点信息,然后来操作.实际工作时,Sentinel 内部维护了一个主题队列,用来保存Redis的节点信息,并实时更新,客户端订阅了这个主题,然后实时的去获取这个队列的Redis节点信息.

7、哨兵模式工作原理

①、三个定时任务

一.每10秒每个 sentinel 对master 和 slave 执行info 命令:该命令第一个是用来发现slave节点,第二个是确定主从关系.

二.每2秒每个 sentinel 通过 master 节点的 channel(名称为_sentinel_:hello) 交换信息(pub/sub):用来交互对节点的看法(后面会介绍的节点主观下线和客观下线)以及自身信息.

三.每1秒每个 sentinel 对其他 sentinel 和 redis 执行 ping 命令,用于心跳检测,作为节点存活的判断依据.

②、主观下线和客观下线

一.主观下线

SDOWN:subjectively down,直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.

二.客观下线

ODOWN:objectively down,直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启故障转移机制.

结合我们第4点搭建主从模式,验证主从切换时,kill掉Redis主节点,然后查看 sentinel 日志,如下:

  发现有类似 sdown 和 odown 的日志.在结合我们配置 sentinel 时的配置文件来看:

#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个
sentinel monitor mymaster 192.168.14.101 6379 2

最后的 2 表示投票数,也就是说当一台 sentinel 发现一个 Redis 服务无法 ping 通时,就标记为 主观下线 sdown;同时另外的 sentinel 服务也发现该 Redis 服务宕机,也标记为 主观下线,当多台 sentinel (大于等于2,上面配置的最后一个)时,都标记该Redis服务宕机,这时候就变为客观下线了,然后进行故障转移.

③、故障转移

故障转移是由 sentinel 领导者节点来完成的(只需要一个sentinel节点),关于 sentinel 领导者节点的选取也是每个 sentinel 向其他 sentinel 节点发送我要成为领导者的命令,超过半数sentinel 节点同意,并且也大于quorum ,那么他将成为领导者,如果有多个sentinel都成为了领导者,则会过段时间在进行选举.

sentinel 领导者节点选举出来后,会通过如下几步进行故障转移:

一.从 slave 节点中选出一个合适的 节点作为新的master节点.这里的合适包括如下几点:

1.选择 slave-priority(slave节点优先级)最高的slave节点,如果存在则返回,不存在则继续下一步判断.

2.选择复制偏移量最大的 slave 节点(复制的最完整),如果存在则返回,不存在则继续.

3.选择runId最小的slave节点(启动最早的节点)

二.对上面选出来的 slave 节点执行 slaveof no one 命令让其成为新的 master 节点.

三.向剩余的 slave 节点发送命令,让他们成为新master 节点的 slave 节点,复制规则和前面设置的 parallel-syncs 参数有关.

四.更新原来master 节点配置为 slave 节点,并保持对其进行关注,一旦这个节点重新恢复正常后,会命令它去复制新的master节点信息.(注意:原来的master节点恢复后是作为slave的角色)

可以从 sentinel 日志中出现的几个消息来进行查看故障转移:

1.+switch-master:表示切换主节点(从节点晋升为主节点)

2.+sdown:主观下线

3.+odown:客观下线

4.+convert-to-slave:切换从节点(原主节点降为从节点)

本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读。回复《电子书》有我为大家特别筛选的书籍资料

/*****************【安装集群环境Cluster-RedisServer】****************/

1.在usr/local目录下新建redis-cluster目录,用于存放集群节点

[root@rocketmq-nameserver1 local]# mkdir redis-cluster

2 把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下,不用担心这里没有redis01目录,会自动创建的。操作命令如下(注意当前所在路径): 

[root@rocketmq-nameserver1 local]# cp -r redis/bin/ redis-cluster/redis01
[root@rocketmq-nameserver1 local]# ll

3 删除redis01目录下的快照文件dump.rdb,并且修改该目录下的redis.cnf文件,具体修改两处地方:一是端口号修改为7001,二是开启集群创建模式,打开注释即可。分别如下图所示:
删除dump.rdb文件 

root@rocketmq-nameserver1 redis01]# rm -f dump.rdb 
[root@rocketmq-nameserver1 redis01]# ll
[root@rocketmq-nameserver1 redis01]# cp /usr/local/redis/redis.conf redis.conf
[root@rocketmq-nameserver1 redis01]# vi redis.conf

 4.修改 port 和 cluster-enable 两个参数,保存退出

5 将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006。分别如下图所示:
创建redis02-06目录 

[root@rocketmq-nameserver1 redis-cluster]# cp -r redis01/ redis02/

6 接着启动所有redis节点,由于一个一个启动太麻烦了,所以在这里创建一个批量启动redis节点的脚本文件,命令为start-cluster.sh,文件内容如下:

[root@rocketmq-nameserver1 redis-cluster]# vi start-cluster.sh
[root@rocketmq-nameserver1 redis-cluster]# ll
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

7 创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下: 

[root@rocketmq-nameserver1 redis-cluster]# chmod +x start-cluster.sh 
[root@rocketmq-nameserver1 redis-cluster]# ll
[root@rocketmq-nameserver1 redis-cluster]# ./start-cluster.sh

8 至此6个redis节点启动成功,接下来正式开启搭建集群,以上都是准备条件。大家不要觉得图片多看起来冗长所以觉得麻烦,其实以上步骤也就一句话的事情:创建6个redis实例(6个节点)并启动。
要搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里。因为这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,指令如下:

[root@rocketmq-nameserver1 redis-cluster]# yum install ruby

9 下载ruby相关的包安装到服务器,我这里用的是redis-4.0.3.gem,大家需要注意的是:redis的版本和ruby包的版本最好保持一致。
下载地址:http://rubygems.org/downloads/redis-4.0.3.gem

[root@rocketmq-nameserver1 redis-cluster]# rz

[root@rocketmq-nameserver1 redis-cluster]# ll
total 120
drwxr-xr-x. 2 root root    170 Dec 29 15:27 redis01
drwxr-xr-x. 2 root root    170 Dec 29 15:27 redis02
drwxr-xr-x. 2 root root    170 Dec 29 15:27 redis03
drwxr-xr-x. 2 root root    170 Dec 29 15:27 redis04
drwxr-xr-x. 2 root root    170 Dec 29 15:27 redis05
drwxr-xr-x. 2 root root    170 Dec 29 15:27 redis06
-rw-r--r--. 1 root root 116224 Dec 29 16:14 redis-4.0.3.gem
-rwxr-xr-x. 1 root root    258 Dec 29 15:25 start-cluster.sh

安装gem发现上面Ruby的版本太低了,至少要2.2.2版本以上 

[root@rocketmq-nameserver1 redis-cluster]# gem redis-4.0.3.gem 
ERROR:  While executing gem ... (Gem::CommandLineError)
    Unknown command redis-4.0.3.gem
[root@rocketmq-nameserver1 redis-cluster]# gem install redis-4.0.3.gem 
ERROR:  Error installing redis-4.0.3.gem:
	redis requires Ruby version >= 2.2.2.

 9.1 安装RVM

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable

  不出意外执行这句会报错 curl: (7) Failed connect to raw.githubusercontent.com:443; Connection refused

  解决方法编辑配置文件并且加入下面的配置 

vim /etc/hosts
199.232.28.133 raw.githubusercontent.com

 重新执行命令,这个时候出现了新的问题

[root@rocketmq-nameserver1 redis-cluster]# curl -L get.rvm.io | bash -s stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   194  100   194    0     0    306      0 --:--:-- --:--:-- --:--:--   306
100 24535  100 24535    0     0   8352      0  0:00:02  0:00:02 --:--:-- 15070
Downloading https://github.com/rvm/rvm/archive/1.29.10.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.10/1.29.10.tar.gz.asc
gpg: Signature made Thu 26 Mar 2020 05:58:42 AM CST using RSA key ID 39499BDB
gpg: Can't check signature: No public key
GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.10.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.10/1.29.10.tar.gz.asc'! Try to install GPG v2 and then fetch the public key:

    gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
    command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

In case of further problems with validation please refer to https://rvm.io/rvm/security

gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

curl -sSL https://get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh

rvm -v

9.2、查看目前的ruby版本

ruby --version

9.3、删除当前ruby版本

rvm remove 2.0.0

9.4、查看RVM库中的ruby版本

rvm list known

9.5、选择安装ruby版本并设为默认

rvm install ruby-2.3.3
rvm use 2.3.3 --default

9.6、安装redis-ruby

gem install redis

10 上一步中已经把ruby工具所需要的运行环境和ruby包安装好了,接下来需要把这个ruby脚本工具复制到usr/local/redis-cluster目录下。那么这个ruby脚本工具在哪里呢?之前提到过,在redis解压文件的源代码里,即redis/src目录下的redis-trib.rb文件。

[root@rocketmq-nameserver1 src]# cd /usr/local/redis/src

11 将该ruby工具(redis-trib.rb)复制到redis-cluster目录下,指令如下:

cp redis-trib.rb /usr/local/redis-cluster

然后使用该脚本文件搭建集群,指令如下 ,--replicas 1 表示主节点配置多少个从节点,这里为1个从节点

./redis-trib.rb create --replicas 1 192.168.247.129:7001 192.168.247.129:7002 192.168.247.129:7003 192.168.247.129:7004 192.168.247.129:7005 192.168.247.129:7006

注意:此处大家应该根据自己的服务器ip输入对应的ip地址!

至此,Redi集群搭建成功!大家注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了0-5460、5461-10922、10933-16383solts。

12 最后连接集群节点,连接任意一个即可:

redis01/redis-cli -p 7001 -c 

注意:一定要加上-c,不然节点之间是无法自动跳转的!如下图可以看到,存储的数据(key-value)是均匀分配到不同的节点的:

四、结语

真他么想死,一个rvm安装查了一万个资料
最后,加上两条redis集群基本命令:
1.查看当前集群信息

cluster info
  • 1

2.查看集群里有多少个节点

cluster nodes

/*****************【安装MySql】*********************/

1.查看MySql是否已经安装

2.官网下载安装包,建议用迅雷地址下载比较快

3.新建一个mysql目录

mkdir /usr/local/mysql

切换目录,上传文件,解压

cd /usr/local/mysql
rz 
tar -zxvf mysql-5.7.29-el7-x86_64.tar.gz

 删除压缩包,切换到解压缩的目录

rm -f mysql-5.7.29-el7-x86_64.tar.gz
mv /usr/local/mysql/mysql-5.7.29-el7-x86_64 /usr/local/mysql/mysql-5.7.29
cd /usr/local/mysql/mysql-5.7.29

 3.1添加用户组与用户 

groupadd mysql
useradd -r -g mysql mysql

3.2修改目录权限

chown -R mysql:mysql /usr/local/mysql/mysql-5.7.29/

4.安装mysql 

4.1配置mysql服务

cp /usr/local/mysql/mysql-5.7.29/support-files/mysql.server /etc/init.d/mysql

4.2修改mysql服务

  vi /etc/init.d/mysql

 

3.3 修改配置文件my.cnf

vi /etc/my.cnf

拷贝内容如下,按需调整参数,直接覆盖掉原来的内容

[client]

port = 3306

default-character-set=utf8

[mysqld]

# 一般配置选项

basedir = /usr/local/mysql/mysql-5.7.29

datadir = /usr/local/mysql/mysql-5.7.29/data

port = 3306

character-set-server=utf8

default_storage_engine = InnoDB

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZEO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3.4初始化mysql  

/usr/local/mysql/mysql-5.7.29/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/mysql-5.7.29 --datadir=/usr/local/mysql/mysql-5.7.29/data

成功如下,注意密码

3.5启动服务

service mysql start

 

4.登录与远程设置  

4.1登录mysql

./mysql -u root -p 输入刚才初始化的密码 

4.2修改root登录密码

set password=password('新密码');

4.3开启远程访问

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456'; --新得密码

flush privileges;

5.环境变量与开机启动配置  

5.1设置环境变量

vi /etc/profile

添加如下内容

# mysql environment

export MYSQL_HOME=/usr/local/mysql/mysql-5.7.29

export PATH=$PATH:$MYSQL_HOME/bin

source /etc/profile更新系统变量

/*****************【安装MySql-开机自启动】*********************/

chkconfig mysql on 设置自启
chkconfig --list查看服务列表

外部客户端先连接mysql需要打开防火墙的3306端口

/*****************【安装ZooKeeper】****************/

1.官网下载zookeeper压缩包后新建目录上传压缩包

cd /usr/local
mkdir zookeeper
cd zookeeper
rz

2 安装zookeeper

2.1、 解压zookeeper安装包,使用tar命令:

tar -zxvf zookeeper-3.4.14.tar.gz

2.2、 修改配置文件:

  • 1、我们进入 conf 文件夹下,可以看到该文件夹的内容如下:
cd conf/
  • 2、这里,我们将 zoo_sample.cfg 复制一份并命名为 zoo.cfg
cp zoo_sample.cfg zoo.cfg

  • 3、使用vi 命令打开zoo.cfg 并修改配置:

这里,我们需要注意上图标白的dataDir位置对应的目录,如果对应的目录不存在,我们需要修改该路径,我们先在zookeeper的解压路径下创建一个新的文件夹 data。

cd /usr/local/zookeeper/zookeeper-3.4.14
mkdir data

其中,可以通过修改clientPort后面的值,修改zookeeper启动端口,默认为2181.

  • 4、启动zookeeper
    在zookeeper目录下的bin文件夹中,使用以下命令启动zookeeper:
./zkServer.sh start

-5 检查zookeeper启动情况
我们可以使用以下命令查看zookeeper的启动状态:

./zkServer.sh status

除此之外,我们也可以通过查看zookeeper的进程来判断其是否启动成功!

ps -ef | grep zookeeper

/*****************【安装ZooKeeper-集群配置】****************/

与单机配置不同的几个点:

所有的集群服务器都要按照下面配置

1 .切换到/usr/local/zookeeper/zookeeper-3.4.14/data目录下面创建myid文件,编辑内容为1并保存 注意:这里要根据当前主机编号来填写(比如三台主机根据1,2,3来填写当前主机的编号)

vim myid

1

2.切换到/usr/local/zookeeper/zookeeper-3.4.14/conf目录下面编辑zoo.cfg文件

   行末尾添加以下配置并保存  注意:这里的端口号和上面配置客户端2181的端口号不能相同

#zk集群 server.myid=服务器ip:服务器之间主从通信端口:服务器之间投票选举端口
server.1=0.0.0.0:2881:3881
server.2=192.168.247.130:2881:3881
server.3=192.168.247.131:2881:3881

3.因为服务器集群之间需要进行通信,所以防火墙要开启 2181 2881 3881端口保证通信正常

4.成功的状态

/*****************【安装ZooKeeper-开机自启动】****************/

我们可以将zookeeper作为一个服务,设置其开机自启,这样每次我们打开虚拟机就可以开启zookeeper,彻底解放双手!设置zookeeper开机自启需要以下几个步骤:

  • 1、进入 /etc/init.d 目录:
    cd /etc/init.d
    ll
    

  • 2、创建文件zookeeper,并添加脚本:
vim zookeeper

脚本内容为:

#!/bin/bash
# chkconfig: 2345 20 10
# description:zookeeper
# processname:zookeeper
ZK_PATH=/usr/local/zookeeper/zookeeper-3.4.14
export JAVA_HOME=/usr/local/java/jdk1.8.0_231
#指定zk的启动日志文件记录地址
export ZOO_LOG_DIR=$ZK_PATH/bin
case $1 in
         start) sh  $ZK_PATH/bin/zkServer.sh start;;
         stop)  sh  $ZK_PATH/bin/zkServer.sh stop;;
         status) sh  $ZK_PATH/bin/zkServer.sh status;;
         restart) sh $ZK_PATH/bin/zkServer.sh restart;;
         *)  echo "require start|stop|status|restart"  ;;
esac

注意:上图的脚本中需要修改正确的zk和jdk安装路径!

  • 3、保存脚本之后,执行以下指令将其注册为服务:
chkconfig zookeeper on
  • 4、切换到/etc/rc2.d目录查看所有开机自启动的脚本程序
    cd /etc/rc2.d
    ll

  • 重启后查看2181端口是否开启

    sudo reboot
    netstat -ntl

 

 /*****************【安装KeepAlived】****************/

方式一.通过官网下载源码安装

rz
tar -zxvf keepalived-2.0.10

 进入解压后的文件夹,进行安装的配置

cd keepalived-2.0.10/
./configure --prefix=/usr/local/keepalived --sysconf=/etc

提示报错,OpenSSL没有安装 

yum -y install openssl-devel

配置后发现有警告,需要安装一个插件

yum -y install libnl libnl-devel

 然后进行安装操作

make && make install

切换到sbin目录,可以看到可执行文件 keepalived

cd /usr/local/keepalived/sbin
ls

切换到/etc/keepalived目录

cd /etc/keepalived

替换默认的keepalived.conf文件内容

#第一部分-全局配置
global_defs {     
   #notification_email {
   
      #acassen@firewall.loc
      
      #failover@firewall.loc
      
      #sysadmin@firewall.loc
   
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   
   #smtp_server 127.0.0.1 切换主备服务器时通知的邮箱服务器
   
   #smtp_connect_timeout 30        
   
   #/etc/hosts 服务器对应的主机名称,主备服务器必须不同
   router_id LVS_DEVEL_128   
   
   #赋予检测脚本root用户权限,允许脚本安全执行
   script_user root
   enable_script_security 
   
}
 
#第二部分-检测脚本-检测主备服务器的nginx是否正常运行
vrrp_script check_nginx_alive {  
 
  #脚本路径
  script "/etc/keepalived/nginx_check.sh" 
  
  #执行的间隔(注意:该间隔要比advert_int检测心跳时间间隔大,当advert_int=1 时 这里必须大于等于5)
  interval 5	
  
  #主服务器挂掉后权重降低
  weight -20      
  }
 
 
#第三部分-设置虚拟ip
vrrp_instance VI_1 { 
   #备份服务器上将MASTER改为BACKUP
   state MASTER
   
   #ifconfig 查看当前服务器网卡
   interface ens33	
   
   #主备服务器的 virtual_router_id 必须相同
   virtual_router_id 51	
   
   #主备服务器不同的优先级,主机值较大,备份机值较小
   priority 100	 
   
   #检测心跳时间间隔 1s
   advert_int 1 
   
   #校验方式 和密码 
   authentication {  
      auth_type PASS
      auth_pass 1111
    }
	
	#执行的脚本,不是脚本的名称,而是上面vrrp_script后面的名称
	track_script {
      check_nginx_alive
    }
	
   #主备服务器对外暴露的共同虚拟ip(可以有多个)
   virtual_ipaddress { 	
     192.168.241.100 
   }
 
}

保存这个脚本后,还有以下步骤

1.切换到/etc目录,修改hosts文件,添加主机名称 LVS_DEVEL_128,主备服务器不同,都要修改

cd /etc
vim hosts

2.切换到/etc/keepalived目录,创建检测nginx脚本名字叫 nginx_check.sh ,脚本内容,注意中间路径指向的是nginx执行程序的路径

#!/bin/bash

A=`ps -C nginx –no-header |wc -l`

if [ $A -eq 0 ];then
   /usr/local/nginx/sbin/nginx
   
   sleep 2

   if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
       killall keepalived
   fi
fi

3.赋予检测nginx脚本系统执行权限

chmod +x /etc/keepalived/nginx_check.sh

赋予权限后该脚本变亮,即为可执行脚本

注意:如果该脚本是在windows上创建的,上传nginx服务器后,格式是dos ,必须转为unix才有权限执行

vim nginx_check.sh

:set  ff

:set ff=unix

:wq

接着添加keepalived到系统服务

切换到安装目录的etc目录并复制配置文件到对应的目录

cd /usr/local/keepalived/keepalived-2.0.10/keepalived/etc

cp init.d/keepalived /etc/init.d

cp sysconfig/keepalived /etc/sysconfig/

4.启动两台服务器的nginx和keepalived

systemctl start nginx
systemctl start keepalived

查看nginx 和 keepalived是否启动成功

5.主备服务器的防火墙要设置vrrp协议的配置,

RRP协议需要MASTER不断广播自己“状态正常”的信息,一旦Backup不能收到Master的广播信息,Backup会尝试切换到Master状态来接管VIP。

所以如果防火墙配置不正确,Master的状态信息无法到达Backup,导致Backup以为Master挂了,出来抢占VIP

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 \
  --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 \
  --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --reload

#注意上面的ens33是服务器的网卡名称,修改为自己的

 

注意:还要查看keepalived系统 日志文件检测配置文件和脚本是否正常运行

systemctl -n 30 -u keepalived

这样的启动日志才是没问题的,这里列举出我掉坑的几个错误日志

(1)WARNING - default user 'keepalived_script' for script execution does not exist - please create

原因:由于脚本执行用户权限问题

解决方案:在keepalived.conf配置文件中添加以下内容

global_defs {
   router_id LVS_DEVEL_128
  #添加内容如下:
   script_user root
   enable_script_security 
}

(2)WARNING - script '/etc/keepalived/nginx_check.sh' is not executable for uid:gid 0:0 - disabling.

原因:backup上keepalived监控脚本没有执行权限

解决方案:给nginx_check.sh脚本执行权限

chmod +x /etc/keepalived/check_nginx.sh

(3)/etc/keepalived/nginx_check.sh exited due to signal 15

原因:检测间隔时间太短

解决方案:提高检测间隔时间

interval 5           #监控脚本的执行时间要大于advert_int(实测3秒太短,5秒起步)
advert_int 1         #心跳检查间隔时间

最后看效果,我这里虚拟ip 192.168.241.100 ,主服务器192.168.241.128 ,备服务器192.168.241.131

1.正常情况下:

2.此时为了模拟主服务器挂掉,备服务器顶上来的效果,

(1)先将nginx.conf 改名为nginx_conf,

(2)查看nginx和keepalived状态,此时都为正常

(3)然后将nginx先关闭,查看nginx和keepalived状态,keepalived状态挂掉了说明脚本执行成功

(4)这样模拟nginx彻底挂掉,并且无法重启,漂移到备服务器

(5)浏览器刷新,成功漂移到备用服务器

 

(3)将主服务器的nginx.conf配置文件恢复正常,启动nginx和keepalived,再刷新浏览器,又重新回到主服务器,这样才是真正实现了高可用

 /*****************【安装KeepAlived-开机自启】****************/

输入指令,重启后查看服务,仍然启动状态,说明成功

chkconfig --add keepalived

chkconfig keepalived on

ps -aux|grep keepalived

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值