国内yum源的安装(163,阿里云,epel)

国内yum源的安装(163,阿里云,epel)

—-阿里云镜像源

1、备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/

CentOS 5

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

CentOS 6

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

CentOS 7

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

或者

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、之后运行 yum clean all,yum makecache 生成缓存

 

—-163镜像源

第一步:备份你的原镜像文件,以免出错后可以恢复。

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup   第二步:下载新的CentOS-Base.repo 到/etc/yum.repos.d/

CentOS 5

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS5-Base-163.repo

CentOS 6

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS6-Base-163.repo

CentOS 7

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo

3、之后运行 yum clean all,yum makecache 生成缓存

—-EPEL

EPEL(Extra Packages for Enterprise Linux)是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS等提供高质量软件包的项目。装上了 EPEL,就像在 Fedora 上一样,可以通过 yum install 软件包名,即可安装很多以前需要编译安装的软件、常用的软件或一些比较流行的软件,比如现在流行的nginx、htop、ncdu、vnstat等等,都可以使用EPEL很方便的安装更新。

 

目前可以直接通过执行命令: yum install epel-release 直接进行安装,如果此命令无法安装可以尝试以下方法

—-安装EPEL 阿里云源

1、备份(如有配置其他epel源)

mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup

mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup

2、下载新repo 到/etc/yum.repos.d/

epel(RHEL 7)

 

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

 

epel(RHEL 6)

 

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

 

epel(RHEL 5)

 

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-5.repo

 

—-官方源直接安装

CentOS/RHEL 5 :

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-5.noarch.rpm

CentOS/RHEL 6 :

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

CentOS/RHEL 7 :

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

tomcat-redis-session-manager

使用redis配置tomcat共享session

结构图:

分析:

分布式web server集群部署后需要实现session共享,针对 tomcat 服务器的实现方案多种多样,
比如 tomcat cluster session 广播、nginx IP hash策略、nginx sticky module等方案,
本文主要介绍了使用 redis 服务器进行 session 统一存储管理的共享方案。

必要环境:

  • java1.7
  • tomcat7
  • redis2.8

nginx 负载均衡配置

  1. 修改nginx conf配置文件加入
     upstream tomcat {
         server 200.10.10.67:8110;
         server 200.10.10.67:8120;
         server 200.10.10.44:8110;
         server 200.10.10.66:8110;
     }
    
  2. 配置 相应的server或者 location地址到 http://tomcat

tomcat session共享配置步骤

  1. 添加redis session集群依赖的jar包到 TOMCAT_BASE/lib 目录下
  2. 修改 TOMCAT_BASE/conf 目录下的 context.xml 文件
     	<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
     	<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
          host="localhost"
          port="6379"
          database="0"
          maxInactiveInterval="60"
          sessionPersistPolicies="PERSIST_POLICY_1,PERSIST_POLICY_2,.."
          sentinelMaster="SentinelMasterName"
          sentinels="sentinel-host-1:port,sentinel-host-2:port,.."/>
    

    属性解释:

    • host redis服务器地址
    • port redis服务器的端口号
    • database 要使用的redis数据库索引
    • maxInactiveInterval session最大空闲超时时间,如果不填则使用tomcat的超时时长,一般tomcat默认为1800 即半个小时
    • sessionPersistPolicies session保存策略,除了默认的策略还可以选择的策略有:
      [SAVE_ON_CHANGE]:每次 session.setAttribute() 、 session.removeAttribute() 触发都会保存. 
      	注意:此功能无法检测已经存在redis的特定属性的变化,
      	权衡:这种策略会略微降低会话的性能,任何改变都会保存到redis中.
      
      [ALWAYS_SAVE_AFTER_REQUEST]: 每一个request请求后都强制保存,无论是否检测到变化.
      	注意:对于更改一个已经存储在redis中的会话属性,该选项特别有用. 
      	权衡:如果不是所有的request请求都要求改变会话属性的话不推荐使用,因为会增加并发竞争的情况。
      
    • sentinelMaster redis集群主节点名称(Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求)
    • sentinels redis集群列表配置(类似zookeeper,通过多个Sentinel来提高系统的可用性)
    • connectionPoolMaxTotal
    • connectionPoolMaxIdle jedis最大能够保持idel状态的连接数
    • connectionPoolMinIdle 与connectionPoolMaxIdle相反
    • maxWaitMillis jedis池没有对象返回时,最大等待时间
    • minEvictableIdleTimeMillis
    • softMinEvictableIdleTimeMillis
    • numTestsPerEvictionRun
    • testOnCreate
    • testOnBorrow jedis调用borrowObject方法时,是否进行有效检查
    • testOnReturn jedis调用returnObject方法时,是否进行有效检查
    • testWhileIdle
    • timeBetweenEvictionRunsMillis
    • evictionPolicyClassName
    • blockWhenExhausted
    • jmxEnabled
    • jmxNameBase
    • jmxNamePrefix

  3. 重启tomcat,session存储即可生效

原文路径:https://github.com/izerui/tomcat-redis-session-manager#tomcat-redis-session-manager

tomcat 7 session 共享 redis

1.下载 jedis-2.9.0.jar  tomcat-redis-session-manager1.2.jar  commons-pool2-2.2.jar 这三个包,复制到Tomcat_HOME/lib 下

2.修改Tomcat_HOME/conf/context.xml

在<Context></Context> 里增加如下内容

1
2
3
4
5
6
7
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="localhost"
         port="6379"
         password="123456"
         database="1"
         maxInactiveInterval="60"/>

redis 服务器地址 端口 密码 等参数请根据实际情况自行修改

搭建Tomcat集群&通过Redis缓存共享session的一种流行方案

为什么要共享session?

我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat上。

但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客户端C创建了会话session,那么Tomcat-B并不知道客户端已与集群中的Tomcat-A产生了会话,在访问时就会为C再创建一份session,如果是基于session的验证会话权限的接口(如用户登录认证后才可访问的数据接口),将会导致在访问集群中不同节点的时候重复认证。session的不共享导致原来的会话管理机制在Tomcat集群中无法工作。

所以,如果有一个Tomcat集群都能访问的公共session存取区就好了,基于这个概念,我们想到了使用Redis来做这个session公共存取区,这样子的话就有一个统一管理回话的地方了。回看我们上文提到的例子,如果Tomcat-A已经为客户端C创建了会话session,这个session信息会直接存储在公共的Redis里面,那么Tomcat-B就可以到公共session存储区里获得已为C产生的session,这样的结果是集群的公共session存取区在逻辑上就像一个tomcat的内部session存取区一样了。

怎么做呢?

有了上述基本的概念,我们就要开始真正施行了。

1. 持久化Tomcat Session到Redis中

Tomcat提供了一个开放的session管理和持久化的org.apache.catalina.session.ManagerBase,继承这个抽象类并做一些简单的配置,即可让你的session管理类接管Tomcat的session读取和持久化。当然,我们在这里使用了一个流行的开源项目:
https://github.com/jcoleman/tomcat-redis-session-manager
,它已经为我们准备好了这样的一个管理类,只要将这个管理类配置在Tomcat中即可发挥功能。它可以帮助我们将tomcat的session存入我们指定的redis,甚至支持redis在sentinel模式调度的redis集群,稍后我们也将详述这样的redis集群该如何部署。

使用这个项目非常简单,如果在Tomcat6或Tomcat7下部署,直接使用项目release出的jar文件到Tomcat的lib下即可,准确来说还需要引入它的其他几个依赖(括号中为建议的):

tomcat-redis-session-manager-VERSION.jar(v1.2)
commons-pool2-VERSION.jar(v2.2)
jedis-VERSION.jar(v2.5.2)

引入后需要在tomcat下修改conf/context.xml

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="{redis.host}"
         port="{redis.port}"
         database="{redis.dbnum}"
         maxInactiveInterval="60"/>

这样一来我们的tomcat即可把session的管理交由我们配置的redis来处理。

需要注意的是,如果在Tomcat8下按照上述部署,会在启动时报错,笔者查看过原因,是tomcat-redis-session-manager最后更新的年代相隔较久,代码中使用的Tomcat api出现了过时删去的情况,在Tomcat8下会出现问题,如果想在Tomcat8下使用,需要自行对过时的api进行修改,替换成新的Tomcat api。笔者自己修改了未经严格验证的一个版本,可供使用Tomcat8的读者试用:
https://github.com/jinhaoplus/tomcat-redis-session-manager

2. nginx反向代理的负载均衡

虽然这不是本文的重点,但是使用负载均衡在搭建集群的过程中重要性不言而喻,使用nginx默认的轮询机制,我们可以将前端的浏览器请求转发到不同的Tomcat实例上。
首先来讲讲正向代理和反向代理,一言以蔽之:正向代理帮助内网client访问外网server用,反向代理将来自外网client的请求f转发到到内网server。
最实际的区别是使用二者时正向代理需要用户主动配置,而反向代理对用户透明,不需要用户做主动配置。
「代理」是指代人理事,即代理服务器是为其他人或机器服务的。
正向代理是替内网中的用户访问外网服务的(即代替用户去访问外网),用户和外网之间的沟通全部交由正向代理服务器完成,用户的请求不发给外网服务器而发给代理服务器让其代为处理,这个过程是隐藏用户的。
反向代理是为真正的服务节点机器服务的(即代替真正的服务节点机器去提供服务),代理服务器接收来自外界的请求,并将请求转给真正的服务节点机器,用户不与真正的机器打交道
,这个过程是隐藏真正的服务实例机器的。

nginx可以作为高效的反向代理服务器,同时起到了负载均衡的作用。如果想要使用反向代理Tomcat集群的负载,方法也非常简单,只需要在其配置nginx.conf中将负载的Tomcat集群的实际地址加入upstream,并将locate导向配好的upstream即可:

http{
    ...
    upstream tomcats {
        server      <tomcat1_ip>:<tomcat1_port>;
        server      <tomcat2_ip>:<tomcat2_port>;
        ...
        server      <tomcatn_ip>:<tomcatn_port>;
      }
    ...
    server {
        listen       80;
        ...
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass      http://tomcats;
        }
      }
}

默认的轮询机制将每次请求都发至不同的Tomcat实例上,以此实现负载均衡。

3. 基于sentinel的redis集群搭建

上文介绍的方法其实已经可以搭建一个完整的Tomcat集群了,如果系统想要一个更安全可靠的环境,那么nginx其实也可以做集群,这里略去不说,我们想要说的是redis集群。

上面我们已经说到redis是session的公共存储区,如果redis不幸挂掉的话将会导致致命的问题,因为无session源可取,Tomcat中有session读取的接口会直接报错。所以搭建一个redis集群还是很有必要的,幸好redis对分布式HA的搭建支持得很好,原生即有一套sentinel哨兵机制即可用。

以sentinel模式启动的redis实例起到了监控者的作用,redis集群以master-slave的模式启动,消息不再直接发给redis实例,而是发给sentinel,由sentinel同步至所有的redis实例,如果出现redismaster实例挂掉的情况,会由sentinel发现,根据配置还可以由sentinel自己组成的集群去选举产生新的master,新的master将会承担起作用,起到了灾难自动回恢复的作用。

这里来说一下sentinel集群的配置:
我们使用两个redis实例来组成master-slave,需要三个sentinel组成哨兵集群来监控两个redis实例,在master出现问题的时候选举产生新的master。
路径假设如下:
redis1
redis2
sentinel1
sentinel2
sentinel3

配置redis1/redis.conf为master:

    bind 127.0.0.1
    port 6379

配置redis2/redis.conf为redis1的slave:

    bind 127.0.0.1
    port 6379
    slaveof <redis1_ip> 6379

配置sentinel1/redis-sentinel.conf

    port 26379    
    sentinel monitor mymaster <redis1_ip> 6379 2

指定redis1为master,slave信息会在启动后被sentinel监听到并自动写入到配置文件中,因此不需要手动写入,最后的quorum表示当有2个sentinel判断master挂掉的时候即可选举slave为新的master。

sentinel2sentinel3配置相同。

这样之后启动redis和sentinel集群,即可构建一个高可用的redis集群。可以尝试一下把redis1这个master挂掉,sentinel就会探查到并且在2个sentinel都探查到的时候即会选举产生新的master:

# +monitor master mymaster <redis1-ip> 6379 quorum 2
# +sdown master mymaster <redis1-ip> 6379

同时我们的Tomcat配置也将改为使用sentinel集群的版本:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         sentinelMaster="mymaster"
         sentinels="<sentinel1-ip>:26379,<sentinel2-ip>:26379,<sentinel3-ip>:26379"
         maxInactiveInterval="60"/>

这个集群搭建完成后,我们的系统将会更为稳定:

SaltStack Syndic 配置

SaltStack Syndic 介绍

我们使用多 Mater 的功能解决了 Master 单点故障的问题,那么保证高可用之后,我们接下来要考虑的就是性能了,
是的,如果你管理的 Minion 数以万计,一个 Master 可能就有一些吃力了,我们需要更加灵活的架构,那么该 Salt Syndic 出场了。

一个基本的 Salt 配置方式是一个 Master 管理一群 Minion,这就是单一的拓扑结构。那么为了增加多种拓扑架构的支持,Salt 在 0.9.0 版本中加入了 Salt Syndic。Syndic 建立在中心 Master 和 Minions 之间,并允许多层分级 Syndic。

Syndic 运行在一个 Master 上,并且连接到另外一个 Master(比它更高级别,我们后面称之为“高级 Master”),这里需要强调的是 Syndic 必须运行在一个 Master 上。

然后 Syndic Minion 所连接的高级 Master 就可以控制连接到运行 Syndic 的 Master 上 的 Minion。这句话稍有点绕,如果一下子没明白,先加深点记忆“Syndic 必须运行在一个 Master 上”,然后再回过头看就好理解了。

1 Syndic 配置

Syndic 对于它管理的 Minion 来说,就是一个 Master 节点,所以 Syndic 没有自己的配置文件,它是 Salt Master 的一个组件:

[root@linux-node1 ~]# yum install salt-syndic -y
[root@linux-node1 ~]# vim /etc/salt/master
syndic_master: 192.168.56.12	# 设置为高级 Master 的 IP
[root@linux-node1 ~]# systemctl restart salt-master
[root@linux-node1 ~]# systemctl start salt-syndic

2 高级 Master 配置

高级 Master 需要使用 order_masters 参数来进行开启:

[root@linux-node2 ~]# yum install salt-master -y
[root@linux-node2 ~]# grep "order_masters" /etc/salt/master
order_masters: True
[root@linux-node1 ~]# systemctl start salt-master

启动之后,在高级 Master 上通过 salt-key 可以看到,Salt Syndic 已经连接上来了,在前面我们提到过 Syndic 节点对于它管理的 Minion 来说就是一个 Master,但是 Syndic 对于高级 Master 来说,它却是一个特殊的 Minion:

[root@linux-node2 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
linux-node1.example.com
Rejected Keys:

3 Syndic 测试

高级 Master 可以控制一群同时运行着“syndic 和 master”的节点,通过 Syndic 将操作命令传输给受控 Master,受控 Master 来完成对自己旗下 Minion 的管理,并将结果传回高级 Master,从而实现高级 Master 对所有 Minion 的间接管理。

高级 Master 同意 Syndic 节点的连接后,使用 test.ping 就可以看到,高级 Master 可以管理所有连接到 Syndic 上面的 Minion:

[root@linux-node2 ~]# salt-key -A
[root@linux-node2 ~]# salt '*' test.ping
linux-node1.example.com:
    True
linux-node2.example.com:
    True

4 Syndic 是如何工作的

Syndic 本质上是一个特殊的 Minion,其代码就位于 minion.py 中。 Syndic 需要在本地运行 Master,并将需要管理的 Minions 的 Master 指向 Syndic 所在的主机。Syndic 是这么来工作的:

  • 冒充 Minion,建立与高级别的 Master 的连接,订阅所有来自高级 Master 下发的任务。
  • 接收高级 Master 下发的数据后,首先进行解密,解密完成后,将其扔到本地的 Master 接口上进行二次下发。
  • Syndic 在进行二次下发之后,监听本地 Event 接口,获取所管理的 Minions 的返回。
  • 将返回发送给高级 Master。

5 Syndic 的优缺点

没有真正完美的架构,使用 Syndic 虽然可以建立多层的 Salt 拓扑,但也是有利有弊,需要使用者根据实际的需求进行权衡。

优点

  • 通过 Syndic,可以建立多层级的 Salt 拓扑,Syndic 下的 Minions 即可通过 Syndic 所在的 Master 进行管理,也可以通过高级 Master 进行管理,架构变得异常灵活。
  • 由于 Syndic 只订阅高级 Master 下发下来的任务,对于文件服务等,Syndic 本地进行配置,可以有效地降低高级 Master 的负载。

缺点

  • 需要保证 Syndic 上的 file_roots 及 pillar_roots 与高级 Master 是一致的。
  • 由于 Syndic 管理了旗下 Minions 的认证,这样高级 Master 并不知道有多少 Syndic 主机,Syndic 下边有多少 Minions。 在高级 Master 上使用 Salt 命令行下发远程执行命令时,如果 Syndic 此时与高级 Master 网络之间有抖动,导致没有收到消息或延迟收到消息, 高级 Master 并不知情。Syndic 并没有返回结果或延迟返回结果,高级 Master 并不能感知到,会导致结果不完整。 如果没有其他验证机制,结果将变得不可控。官方提供的解决方案是增大 syndic_wait 选项,但是只能缓解,并不能根治问题。

建议

没有系统或工具是 100% 可靠的。基于这一观点,无论是否使用 Salt 的架构扩展,对于运维使用 SaltStack 来说, 如果能从流程上对每次 SaltStack 的执行结果进行检查和验证,是比较稳妥的方案,可能也算是比较保守吧。

遇到的问题

1.使用之前配置的环境,linux-node1 是无 Master 架构,还有其他报错。

处理方法:最简化 Salt Master 和 Minion 的配置,排除其他原因。

[root@linux-node1 ~]# cat /etc/salt/master
syndic_master: 192.168.56.12
[root@linux-node1 ~]# cat /etc/salt/minion
master: 192.168.56.11

[root@linux-node2 ~]# cat /etc/salt/master
order_masters: True
[root@linux-node2 ~]# cat /etc/salt/minion
master: 192.168.56.11

2.经过第 1 步处理,还有如下报错:

[root@linux-node1 ~]# systemctl status salt-syndic
● salt-syndic.service - The Salt Master Server
   Loaded: loaded (/usr/lib/systemd/system/salt-syndic.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2016-08-01 18:45:20 CST; 11s ago
  Process: 22082 ExecStart=/usr/bin/salt-syndic (code=exited, status=1/FAILURE)
 Main PID: 22082 (code=exited, status=1/FAILURE)

Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: [ERROR   ] The master key has changed, the salt master could have been subverted, verify salt master's public key
Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: [CRITICAL] The Salt Master server's public key did not authenticate!
Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: The master may need to be updated if it is a version of Salt lower than 2016.3.1, or
Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: If you are confident that you are connecting to a valid Salt Master, then remove the master public key and restart the Salt Minion.
Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: The master public key can be found at:
Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: /etc/salt/pki/minion/syndic_master.pub
Aug 01 18:45:20 linux-node1.example.com salt-syndic[22082]: Invalid master key
Aug 01 18:45:20 linux-node1.example.com systemd[1]: salt-syndic.service: main process exited, code=exited, status=1/FAILURE
Aug 01 18:45:20 linux-node1.example.com systemd[1]: Unit salt-syndic.service entered failed state.
Aug 01 18:45:20 linux-node1.example.com systemd[1]: salt-syndic.service failed.


# 以上错误提示 master key 改变了,可以尝试移除 master 公钥,然后重启 minion

[root@linux-node1 ~]# ll /etc/salt/pki/minion/
total 16
-rw-r--r-- 1 root root  450 Jun 29 15:48 minion_master.pub
-r-------- 1 root root 1674 Jun 29 15:48 minion.pem
-rw-r--r-- 1 root root  450 Jun 29 15:48 minion.pub
-rw-r--r-- 1 root root  450 Aug  1 15:59 syndic_master.pub		# 这个 master 公钥是之前配置生成的,需要删除
[root@linux-node1 ~]# rm -f /etc/salt/pki/minion/syndic_master.pub 
[root@linux-node1 ~]# systemctl restart salt-syndic

[root@linux-node1 ~]# ll /etc/salt/pki/minion/
total 16
-rw-r--r-- 1 root root  450 Jun 29 15:48 minion_master.pub
-r-------- 1 root root 1674 Jun 29 15:48 minion.pem
-rw-r--r-- 1 root root  450 Jun 29 15:48 minion.pub
-rw-r--r-- 1 root root  450 Aug  1 18:59 syndic_master.pub		# 重启 salt-syndic 后,master 公钥重新生成了

 

手把手教你安装OpenStack——Ocata安装指南

本文参考:https://docs.openstack.org/ocata/install-guide-rdo/index.html官方文档来手把手教你安装Ocata,安装文档中有漏洞的地方,本文都会提及。本指南不会给出所有命令的输出结果,只给出部分必要的解释,因此在安装时最好对照着官方文档进行。

本文目录:

  • 安装环境
  • 认证服务
  • 镜像服务
  • 计算服务
  • 网络服务
  • Dashboard

一、安装环境 1、示例架构

根据官方文档,本文架构采用一个控制节点和一个计算节点。

(The example architecture requires at least twonodes (hosts) to launch a basic virtual machine or instance. )

控制节点运行认证服务、镜像服务、计算服务的管理部分、网络服务的管理部分、各种网络代理以及Dashboard,还包括一些基础服务如数据库、消息队列以及NTP。

计算节点上运行计算服务中管理实例的管理程序部分。默认情况下,计算服务使用 KVM。还运行网络代理服务,用来连接实例和虚拟网络以及通过安全组给实例提供防火墙服务。

2、网络

  • 公有网络

公有网络选项以尽可能简单的方式通过layer-2(网桥/交换机)服务以及VLAN网络的分割来部署OpenStack网络服务。实际上,它将虚拟网络桥接到物理网络,并依靠物理网络基础设施提供layer-3服务(路由)。另外,DHCP服务为实例提供IP地址。

  • 私有网络

私有网络选项扩展了公有网络选项,增加了layer-3(路由)服务,使用VXLAN类似的方式。本质上,它使用NAT路由虚拟网络到物理网络。另外,这个选项也提供高级服务的基础,比如LBaas和FWaaS。

这里我们选择私有网络。

3、安全

下面是各个需要密码的服务以及解释,建议这些密码使用同一个,以免混淆。

4、主机网络配置

控制节点

  • 配置网络接口

Controller:IP:192.168.0.112/24 GATEWAY:192.168.0.1

网络配置完之后需要将防火墙和selinux关闭。

  • 关闭防火墙:

systemctl stop firewalld.service

  • 禁止防火墙开机启动

systemctl disable firewalld.service

  • 关闭selinux

vim /etc/selinux/config,配置selinux=disabled

# setenforce 0,使配置立即生效

  • 配置地址解析

编辑/etc/hosts

# controller

192.168.0.112 controller

# compute1

192.168.0.113 compute1

计算节点

  • 配置网络接口。

Compute:IP:192.168.0.113/24 GATEWAY:192.168.0.1

同样需要配置地址解析,参考控制节点。

配置完成之后需要进行验证:

  • 与外网连通性:

分别在控制节点和计算节点上:

# ping -c 4 www.baidu.com

  • 控制节点和计算节点连通性:

控制节点上输入# ping -c 4 compute1

计算节点上输入# ping -c 4 controller

5、NTP

控制节点

  • 安装相关包

# yum install chrony

  • 编辑 /etc/chrony.conf

server NTP_SERVER iburst

可以根据需要将NTP_SERVER替换为合适的NTP服务器,建议不用改。然后添加:

allow 192.168.0.0/24

即允许计算节点同步。(计算节点IP网段属于192.168.0.0)

# systemctl enable chronyd.service

# systemctl start chronyd.service

启动服务。

计算节点

编辑/etc/chrony.conf,可以将其他的几个同步地址注释掉。

server controller iburst

同步控制节点。

# systemctl enable chronyd.service

# systemctl start chronyd.service

启动服务。(如果发现同步的不是控制节点,那么重启一下NTP服务即可。)

# systemctl restart chronyd.service

验证操作:

在控制节点上同步时间。

# chronyc sources

带星号的是NTP当前同步的地址。

计算节点上同步。

# chronycsources

210 Number of sources = 1

MS Name/IP address

Stratum Poll Reach LastRx Last sample

======================================================

^* controller 3 9 377 421 +15us[ -87us] +/- 15ms

6、安装OpenStack包

以下操作在所有节点上进行。

  • 启用OpenStack库:

# yum install centos-release-openstack-ocata

  • 完成安装

1)在所有节点上升级包

# yum upgrade

2)安装OpenStack 客户端

# yum install python-openstackclient

3)CentOS默认启用了SELinux,安装openstack-selinux来自动管理OpenStack服务的安全策略。

# yum install openstack-selinux

7、安装数据库

数据库一般运行在控制节点上。

安装并配置组件。

  • 安装相关包。

# yum install mariadb mariadb-server python2-PyMySQL

创建并编辑/etc/my.cnf.d/openstack.cnf 文件,并完成以下操作。在配置文件中添加以下配置:

[mysqld]

bind-address=192.168.0.112

default-storage-engine=innodb

innodb_file_per_table=on

max_connections=4096

collation-server=utf8_general_ci

character-set-server=utf8

其中bind-address为控制节点IP地址。

  • 完成安装

1)启动数据库并设置开机启动

# systemctl enable mariadb.service

# systemctl start mariadb.service

2)运行mysql_secure_installation脚本来保证数据库安全,为root账户设置一个合适的密码

# mysql_secure_installation

8、消息队列

OpenStack使用消息队列来协调服务之间的状态和操作,消息队列服务一般运行在控制节点上。,OpenStack支持RabbitMQ,Qpid以及ZeroMQ等消息队列服务。本指南使用RabbitMQ消息队列服务。

  • 安装相关包

# yum install rabbitmq-server

  • 启动消息队列并设置开机启动

# systemctl enable rabbitmq-server.service

# systemctl start rabbitmq-server.service

  • 添加openstack用户

#rabbitmqctl add_user openstack RABBIT_PASS

Creating user “openstack” …

使用合适的密码替换掉 RABBIT_PASS

  • 允许openstack用户的配置、写、读权限

#rabbitmqctl set_permissions openstack”.*””.*””.*”

Setting permissions for user “openstack” in vhost “/” …

9、缓存令牌

认证服务的认证机制使用Memcached来缓存令牌,一般运行在控制节点上。

  • 安装相关包

# yum install memcached python-memcached

编辑 /etc/sysconfig/memcached文件并配置IP地址,将127.0.0.1改为控制节点IP。

  • 完成安装

启动 Memcached服务并设置开机启动。

# systemctl enable memcached.service

# systemctl start memcached.service

二、认证服务

控制节点上配置。 1、前提条件

  • 创建数据库

以root身份登录数据库

$ mysql -u root -p

创建keystone数据库

MariaDB[(none)]> CREATE DATABASE keystone;

给数据库赋予适当的权限;

MariaDB [(none)]> GRANT ALL PRIVILEGESON keystone.* TO ‘keystone’@’localhost’

IDENTIFIED BY ‘KEYSTONE_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON keystone.* TO ‘keystone’@’%’

IDENTIFIED BY ‘KEYSTONE_DBPASS’;

用合适的密码替换KEYSTONE_DBPASS

2、安装并配置组件

  • 运行命令安装相关包

# yum install openstack-keystone httpd mod_wsgi

编辑文件/etc/keystone/keystone.conf

在[database]选项配置数据库连接

[database]

# …

connection=mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

替换掉KEYSTONE_DBPASS

在[token]选项中,配置,Fernet令牌提供者:

[token]

# …

provider=fernet

  • 同步认证服务数据库

# su -s/bin/sh -c “keystone-manage db_sync” keystone

  • 初始化Fernetkey仓库

# keystone-manage fernet_setup –keystone-user keystone –keystone-

groupkeystone

# keystone-manage credential_setup –keystone-user keystone–keystone-groupkeystone

  • 引导认证服务

# keystone-manage bootstrap –bootstrap-password ADMIN_PASS

–bootstrap-admin-urlhttp://controller:35357/v3/

–bootstrap-internal-urlhttp://controller:5000/v3/

–bootstrap-public-urlhttp://controller:5000/v3/

–bootstrap-region-id RegionOne

替换掉ADMIN_PASS

  • 配置Apache服务器
  1. 编辑/etc/httpd/conf/httpd.conf并配置ServerName选项,使之参考控制节点
  2. 给/usr/share/keystone/wsgi-keystone.conf文件创建一个链接

# ln -s/usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

  • 完成安装

1.启动Apache服务器并设置开机启动

# systemctlenable httpd.service

# systemctl start httpd.service

2.配置管理账户

$export OS_USERNAME=admin

$export OS_PASSWORD=ADMIN_PASS

$export OS_PROJECT_NAME=admin

$export OS_USER_DOMAIN_NAME=Default

$export OS_PROJECT_DOMAIN_NAME=Default

$export OS_AUTH_URL=http://controller:35357/v3

$export OS_IDENTITY_API_VERSION=3

3、创建一个域、项目、用户和角色

  • 本指南有一个service 项目,你添加的每一个服务都有唯一的用户。

$ openstack project create –domain default

–deion “Service Project”service

  • 普通的任务不应该使用具有特权的项目和用户。作为示例,本指南创建一个demo项目和用户。

1、创建demo项目:

$ openstack project create –domain default

–deion “Demo Project”demo

2、创建demo用户:

$ openstack user create –domain default

–password-prompt demo

3、创建user角色:

$ openstack role create user

4、将user角色添加到demo项目和用户中。

$ openstack role add –project demo –user demo user

4、验证操作

  • 出于安全性的原因,禁用掉暂时的认证令牌机制。

编辑/etc/keystone/keystone-paste.ini文件,并从[pipeline:public_api], [pipeline:admin_api], 和[pipeline:api_v3]选项中删除admin_token_auth

  • 取消设置临时的OS_AUTH_URL和OS_PASSWORD环境变量:

$unset OS_AUTH_URL OS_PASSWORD

  • 使用admin用户,请求一个认证令牌;

$ openstack –os-auth-url http://controller:35357/v3

–os-project-domain-name default–os-user-domain-name default

–os-project-name admin –os-username admintoken issue

这里遇到错误

由于是Http错误,所以返回Apache HTTP 服务配置的地方,重启Apache 服务,并重新设置管理账户:

# systemctlrestart httpd.service

$ export OS_USERNAME=admin

$ export OS_PASSWORD=ADMIN_PASS

$ export OS_PROJECT_NAME=admin

$ export OS_USER_DOMAIN_NAME=Default

$ export OS_PROJECT_DOMAIN_NAME=Default

$ export OS_AUTH_URL=http://controller:35357/v3

$ export OS_IDENTITY_API_VERSION=3

错误解决!

  • 使用demo用户,请求认证令牌:

$ openstack–os-auth-url http://controller:5000/v3

–os-project-domain-namedefault –os-user-domain-name default

–os-project-namedemo –os-username demo token issue

Password:

密码为创建demo用户时的密码。

5、创建OpenStack客户端环境脚本:

在前面章节中,我们使用环境变量和命令的组合来配置认证服务,为了更加高效和方便,我们创建一个脚本方便以后的操作。这些脚本包括一些公共的操作,但是也支持自定义的操作。

  • 创建脚本

创建并编辑admin-openrc文件,并添加以下内容:

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=root

export OS_AUTH_URL=http://controller:35357/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

替换掉OS_PASSWORD的密码。

创建并编辑demo-openrc文件,并添加以下内容:

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=demo

export OS_USERNAME=demo

export OS_PASSWORD=DEMO_PASS

export OS_AUTH_URL=http://controller:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

  • 使用脚本

加载脚本文件更新环境变量:

$ . admin-openrc

请求一个认证令牌;

$ openstack token issue

三、镜像服务

1、前提条件

  • 创建数据库

连接数据库,使用root登录。

$ mysql -u root -p

创建 glance 数据库

MariaDB [(none)]> CREATE DATABASEglance;

赋予权限:

MariaDB [(none)]> GRANT ALL PRIVILEGESON glance.* TO ‘glance’@’localhost’

IDENTIFIED BY ‘GLANCE_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON glance.* TO ‘glance’@’%’

IDENTIFIED BY ‘GLANCE_DBPASS’;

替换GLANCE_DBPASS为合适的密码;

退出数据库连接。

  • 导入admin证书来获取只有admin才能执行的命令行权限;

$ . admin-openrc

  • 创建服务认证:

创建glance用户

$ openstack user create –domain default –password-prompt glance

添加管理员角色到glance用户和service项目中:

$ openstack role add –project service –user glance admin

  • 创建glance服务实体

创建镜像服务API端口:

$ openstack endpoint create –region RegionOne

imagepublic http://controller:9292

$ openstack endpoint create –region RegionOne

image internal http://controller:9292

$ openstack endpoint create –region RegionOne

image admin http://controller:9292

2、安装并配置组件

  • 安装相关包:

# yum install openstack-glance

  • 编辑/etc/glance/glance-api.conf文件,完成以下操作;

在[keystone_authtoken]和[paste_deploy]选项中,配置认证服务权限:

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=glance

password=GLANCE_PASS

[paste_deploy]

# …

flavor=keystone

替换掉GLANCE_PASS密码。删除或注释掉其他[keystone_authtoken]参数。

在[glance_store]选项中,配置本地文件系统存储和镜像文件位置。

[glance_store]

# …

stores=file,http

default_store=file

filesystem_store_datadir=/var/lib/glance/images/

编辑/etc/glance/glance-registry.conf文件,并完成以下操作:

在[database]选项中,配置数据库权限:

[database]

# …

connection=mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

替换掉 GLANCE_DBPASS密码。

在[keystone_authtoken]和[paste_deploy]选项中,配置认证服务权限:

[keystone_authtoken]# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=glance

password=GLANCE_PASS

[paste_deploy]

# …

flavor=keystone

替换掉GLANCE_DBPASS密码。

4、更新镜像服务数据库

完成安装

  • 启动镜像服务并设置开机启动。

# systemctl enable openstack-glance-api.service

openstack-glance-registry.service

# systemctl start openstack-glance-api.service

openstack-glance-registry.service

5、验证操作

  • 获取admin权限

$ . admin-openrc

  • 下载源镜像

$ wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img

  • 上传镜像

$ openstack image create “cirros”

–file cirros-0.3.4-x86_64-disk.img

–disk-format qcow2 –container-format bare

–public

  • 验证上传镜像:

openstack image list

四、计算服务 1、安装和配置控制节点

  • 准备条件

创建数据库,与之前步骤类似,这里不再详细列出

$ mysql -u root -p

MariaDB [(none)]> CREATE DATABASEnova_api;

MariaDB [(none)]> CREATE DATABASE nova;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova_api.* TO ‘nova’@’localhost’

IDENTIFIED BY ‘NOVA_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova_api.* TO ‘nova’@’%’

IDENTIFIED BY ‘NOVA_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova.* TO ‘nova’@’localhost’

IDENTIFIED BY ‘NOVA_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova.* TO ‘nova’@’%’

IDENTIFIED BY ‘NOVA_DBPASS’;

  • 获取admin权限:

$ . admin-openrc

创建nova用户

$ openstack user create –domain default

–password-prompt nova

设置合适的密码

向nova用户中添加admin角色。

$ openstack role add –project service –user nova admin

创建nova服务实体

$ openstack service create –name nova

–deion “OpenStack Compute” compute

2、创建计算服务API端口

$ openstack endpoint create –region RegionOne

compute public http://controller:8774/v2.1/%(tenant_id)s

$ openstack endpoint create –region RegionOne

compute internal http://controller:8774/v2.1/%(tenant_id)s

$ openstack endpoint create –region RegionOne

compute admin http://controller:8774/v2.1/%(tenant_id)s

  • 安装并配置组件

安装相关包

# yum install openstack-nova-api openstack-nova-conductor

openstack-nova-console openstack-nova-novncproxy

openstack-nova-scheduler

  • 编辑 /etc/nova/nova.conf文件

在[DEFAULT]选项中,开启计算和元数据API

[DEFAULT]

# …

enabled_apis=osapi_compute,metadata

在 [api_database]和[database]选项中,配置数据库连接

[api_database]

# …

connection=mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api

[database]

# …

connection=mysql+pymysql://nova:NOVA_DBPASS@controller/nova

替换NOVA_DBPASS密码。

在[DEFAULT]选项中,配置消息队列连接。

[DEFAULT]

# …

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换掉RABBIT_PASS

在[api]和[keystone_authtoken]选项中,

[api]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=nova

password=NOVA_PASS

替换掉NOVA_PASS

在[DEFAULT]选项中,配置my_ip

[DEFAULT]

# …

my_ip=10.0.0.11

开启对网络服务的支持

[DEFAULT]

# …

use_neutron=True

firewall_driver=nova.virt.firewall.NoopFirewallDriver

在[vnc]选项中,配置VNC代理

[vnc]

enabled=true

# …

vncserver_listen=$my_ip

vncserver_proxyclient_address=$my_ip

在[glance]选项中,配置镜像服务API的位置。

[glance]

# …

api_servers=http://controller:9292

在[oslo_concurrency]选项中,配置锁定路径

[oslo_concurrency]

# …

lock_path=/var/lib/nova/tmp

更新数据库

#su -s /bin/sh -c”nova-manage api_db sync”nova

#su -s /bin/sh -c “nova-manage db sync”nova

  • 完成安装

开启计算服务并设置开机启动;

# systemctl enable openstack-nova-api.service

openstack-nova-consoleauth.service openstack-nova-scheduler.service

openstack-nova-conductor.service openstack-nova-novncproxy.service

# systemctl start openstack-nova-api.service

openstack-nova-consoleauth.service openstack-nova-scheduler.service

openstack-nova-conductor.service openstack-nova-novncproxy.service

3、安装并配置计算节点

  • 安装并配置组件

安装相关包

# yum install openstack-nova-compute

编辑/etc/nova/nova.conf文件

在[DEFAULT]选项中,开启计算和元数据API

[DEFAULT]

# …

enabled_apis=osapi_compute,metadata

在[DEFAULT]选项中,配置消息队列权限

[DEFAULT]

# …

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换掉RABBIT_PASS

在[api]和[keystone_authtoken]选项中,配置认证服务权限

[api]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=nova

password=NOVA_PASS

替换掉NOVA_PASS

在[DEFAULT]选项中,配置my_ip参数

[DEFAULT]

# …

my_ip=MANAGEMENT_INTERFACE_IP_ADDRESS

替换MANAGEMENT_INTERFACE_IP_ADDRESS为计算节点IP

在[DEFAULT]选项中,开启网络服务支持

[DEFAULT]

# …

use_neutron=True

firewall_driver=nova.virt.firewall.NoopFirewallDriver

在[vnc]选项中,开启并配置远程控制台权限

[vnc]

# …

enabled=True

vncserver_listen=0.0.0.0

vncserver_proxyclient_address=$my_ip

novncproxy_base_url=http://controller:6080/vnc_auto.html

在[glance]选项中,配置镜像服务API地址

[glance]

# …

api_servers=http://controller:9292

在[oslo_concurrency]选项,配置锁定路径

[oslo_concurrency]

# …

lock_path=/var/lib/nova/tmp

4、完成安装

  • 检查你的计算节点是否支持硬件虚拟化

$ egrep -c ‘(vmx|svm)’ /proc/cpuinfo

如果输出值大于等于1,那么不需要配置,否则,需要做一下配置

编辑/etc/nova/nova.conf文件,配置[libvirt]

[libvirt]

# …

virt_type=qemu

  • 开启计算服务并设置开机启动

# systemctl enable libvirtd.serviceopenstack-nova-compute.service

# systemctl start libvirtd.service openstack-nova-compute.service

  • 验证操作

在控制节点上进行操作。

获取admin权限

$ . admin-openrc

列出服务组件来验证每个组件都成功运行了

$ openstack compute service list

这里遇到问题:发现计算节点上服务没有启动

查看计算节点日志:/var/log/nova/nova-compute.log发现

里面提到需要配置placement,而官方文档并没有提到这一点。解决办法是安装openstack-nova-placement-api,并配置相关选项。

控制节点上,然后创建用户把用户placement添加到项目中去并创建placement类型的服务目录:

最终创建端口:

openstack endpoint create –regionRegionOne placement public http://192.168.0.112:8778

openstack endpoint create –regionRegionOne placement admin

openstack endpoint create –regionRegionOne placement intenal http://192.168.0.112:8778

在计算节点上编辑文件:/etc/nova/nova.conf

在placement选项中添加:

auth_uri = http://controller:5000

auth_url = http://controller:35357

memcached_servers = controller:11211

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = nova

password = root

os_region_name = RegionOne

替换掉password,重启计算服务:

# systemctl restartopenstack-nova-compute.service

可以看到服务已经启动:

控制节点上也显示正常:

在此参考了

,特别感谢!

下面接着验证操作:

3、列出认证服务中的API端口以检查连通性

$ openstack catalog list

4、列出镜像服务中的镜像以验证连通性;

$ openstack image list

五、网络服务

安装并配置控制节点

1、前提条件

创建数据库,与之前类似:

$ mysql -u root -p

MariaDB [(none)] CREATE DATABASE neutron;

MariaDB [(none)]> GRANT ALL PRIVILEGESON neutron.* TO ‘neutron’@’localhost’

IDENTIFIED BY ‘NEUTRON_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON neutron.* TO ‘neutron’@’%’

IDENTIFIED BY ‘NEUTRON_DBPASS’;

获取admin权限:

$ . admin-openrc

创建服务认证:

创建neutron用户

$ openstack user create –domain default –password-prompt neutron

给neutron添加admin角色:

$ openstack role add –project service –user neutron admin

创建neutron服务实体:

$ openstack service create –name neutron

–deion “OpenStack Networking” network

创建网络服务API端口:

$ openstack endpoint create –region RegionOne

network public http://controller:9696

$ openstack endpoint create –region RegionOne

network internal http://controller:9696

$ openstack endpoint create –region RegionOne

network admin http://controller:9696

2、配置网络选项

选项1:部署一个最简单的网络,仅支持实例和公共网络的连接。

选项2:在选项1的基础上,增加了3层服务,支持实例连接到私有网络。

这里我们选择选项2,选项2的部署包括选项1。

在控制节点上进行以下操作:

安装组件

# yum install openstack-neutron openstack-neutron-ml2

openstack-neutron-linuxbridge ebtables

配置服务器组件

编辑/etc/neutron/neutron.conf文件,并完成以下配置:

在[database]选项中,配置数据库连接:

[database]

# …

connection=mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron

替换掉NEUTRON_DBPASS密码。注释掉或者删除[database]其他参数。

在[DEFAULT]选项中,开启ML2插件,路由服务以及overlapping IP地址,配置消息队列连接:

[DEFAULT]

# …

core_plugin=ml2

service_plugins=router

allow_overlapping_ips=true

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换掉RABBIT_PASS

在[DEFAULT]选项和[keystone_authtoken]选项中,配置认证服务连接

[DEFAULT]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=neutron

password=NEUTRON_PASS

替换掉NEUTRON_PASS

注释或删除[keystone_authtoken]中的其他选项。

在[DEFAULT]和[nova]选项中,配置网络来通知计算机网络拓扑的变换:

[DEFAULT]

# …

notify_nova_on_port_status_changes=true

notify_nova_on_port_data_changes=true

[nova]

# …

auth_url=http://controller:35357

auth_type=password

project_domain_name=default

user_domain_name=default

region_name=RegionOne

project_name=service

username=nova

password=NOVA_PASS

替换掉NOVA_PASS

在[oslo_concurrency]选项中,配置锁定地址:

[oslo_concurrency]

# …

lock_path=/var/lib/neutron/tmp

配置ML2

编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件,在ml2选项中,开启flat,VLAN,以及VXLAN网络:

[ml2]

# …

type_drivers=flat,vlan,vxlan

开启VXLAN私有网络:

[ml2]

# …

tenant_network_types=vxlan

开启桥接和2层机制

[ml2]

# …

mechanism_drivers=linuxbridge,l2population

Linux桥接代理仅支持VXLAN覆盖网络,开启端口安全扩展驱动:

[ml2]

# …

extension_drivers=port_security

在选项中;配置公共虚拟网络作为扁平网络:

[ml2_type_flat]

# …

flat_networks=provider

为私有网络配置VXLAN网络识别范围

[ml2_type_vxlan]

# …

vni_ranges=1:1000

在[securitygroup]选项中,开启ipset增加安全组规则的高效性;

[securitygroup]

# …

enable_ipset=true

配置Linux 桥接代理

编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

在[linux_bridge]选项中,映射公共虚拟网络到公共物理网络接口;

[linux_bridge]

physical_interface_mappings=provider:PROVIDER_INTERFACE_NAME

将PROVIDER_INTERFACE_NAME替换为公共网络网卡名字

在选项中,开始VXLAN覆盖网络,配置物理网络的IP地址,启用L2。

[vxlan]

enable_vxlan=true

local_ip=OVERLAY_INTERFACE_IP_ADDRESS

l2_population=true

将OVERLAY_INTERFACE_IP_ADDRESS替换为管理网络IP地址,即控制节点IP。(没有配置管理网络)

在[securitygroup]选项中,启用安全组并配置Linux桥接iptables防火墙驱动;

[securitygroup]

# …

enable_security_group=true

firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置3层代理

编辑/etc/neutron/l3_agent.ini文件

在[DEFAULT]选项中,配置Linuxbridge驱动接口

[DEFAULT]

# …

interface_driver=linuxbridge

配置DHCP代理

编辑/etc/neutron/dhcp_agent.ini文件

在[DEFAULT]选项中,配置inuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在公共网络上的实例就可以通过网络来访问元数据

[DEFAULT]

# …

interface_driver=linuxbridge

dhcp_driver=neutron.agent.linux.dhcp.Dnsmasq

enable_isolated_metadata=true

配置元数据代理

在[DEFAULT]选项中,配置元数据主机和共享密码

[DEFAULT]

# …

nova_metadata_ip=controller

metadata_proxy_shared_secret=METADATA_SECRET

替换METADATA_SECRET为合适的密码

配置计算服务来使用网络

编辑/etc/nova/nova.conf文件

在[neutron]选项中,配置连接参数,启用元数据代理,配置密码:

[neutron]

# …

url=http://controller:9696

auth_url=http://controller:35357

auth_type=password

project_domain_name=default

user_domain_name=default

region_name=RegionOne

project_name=service

username=neutron

password=NEUTRON_PASS

service_metadata_proxy=true

metadata_proxy_shared_secret=METADATA_SECRET

替换NEUTRON_PASS,METADATA_SECRET

3、完成安装

建立符号链接

# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

上传数据库

# su -s /bin/sh -c “neutron-db-manage –config-file /etc/neutron/neutron.conf

–config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head” neutron

重启计算API服务

# systemctl restart openstack-nova-api.service

启动网络服务并配置开机启动

# systemctl enable neutron-server.service

neutron-linuxbridge-agent.service neutron-dhcp-agent.service

neutron-metadata-agent.service

# systemctl start neutron-server.service

neutron-linuxbridge-agent.service neutron-dhcp-agent.service

neutron-metadata-agent.service

对于网络选项2,也要启用3层服务

# systemctl enable neutron-l3-agent.service

# systemctl start neutron-l3-agent.service

安装并配置计算节点1、安装组件

# yum install openstack-neutron-linuxbridge ebtables ipset

配置公共组件

编辑/etc/neutron/neutron.conf文件

在[database]中,注释掉任何的连接,因为计算节点不直接连接数据库。

在[DEFAULT],配置消息队列连接

[DEFAULT]

# …

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换RABBIT_PASS

在[DEFAULT]和[keystone_authtoken]选项中

[DEFAULT]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=neutron

password=NEUTRON_PASS

替换NEUTRON_PASS密码

在[oslo_concurrency]选项中,配置锁定路径

[oslo_concurrency]

# …

lock_path=/var/lib/neutron/tmp

在计算节点上配置网络选项2

配置Linux桥接代理

编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

在[linux_bridge]部分,映射公共虚拟网络到公共物理网络接口:

[linux_bridge]

physical_interface_mappings=provider:PROVIDER_INTERFACE_NAME

把PROVIDER_INTERFACE_NAME替换为物理网卡名字。

在[vxlan]部分,启用VXLAN覆盖网络,配置物理网络IP地址,启用l2_population:

[vxlan]

enable_vxlan=true

local_ip=OVERLAY_INTERFACE_IP_ADDRESS

l2_population=true

在[securitygroup]部分,启用安全组并配置Linux桥接iptables防火墙驱动:

[securitygroup]

# …

enable_security_group=true

firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

为计算节点配置网络服务:

编辑/etc/nova/nova.conf文件

在[neutron]部分,配置连接参数;

[neutron]

# …

url=http://controller:9696

auth_url=http://controller:35357

auth_type=password

project_domain_name=default

user_domain_name=default

region_name=RegionOne

project_name=service

username=neutron

password=NEUTRON_PASS

替换NEUTRON_PASS

完成安装

重启计算服务:

# systemctl restart openstack-nova-compute.service

启动Linux桥接代理并配置开机启动:

# systemctl enable neutron-linuxbridge-agent.service

# systemctl start neutron-linuxbridge-agent.service

验证操作

获取admin权限

$ . admin-openrc

列出加载的扩展来验证neutron-server是否成功运行:

$ openstack extension list –network

验证网络:

在控制节点上,列出所有的代理:

$ openstack network agent list

输出应该是4个控制节点上的代理和一个计算节点上的代理。

六、Dashboard

安装和配置

验证操作

安装并配置组件

安装相关包

# yum install openstack-dashboard

编辑/etc/openstack-dashboard/local_settings文件,修改以下配置

注:以下的配置大部分在原配置文件中都包括,修改即可,不要直接添加。

配置dashboard在控制节点上使用OpenStack服务:

OPENSTACK_HOST=”controller”

允许主机连接到dashboard:

ALLOWED_HOSTS=[‘*,]

*表示允许所有主机连接dashboard,在生产环境中不建议这样做。

配置memcached存储服务:

SESSION_ENGINE=’django.contrib.sessions.backends.cache’

CACHES={

‘default’:{

‘BACKEND’:’django.core.cache.backends.memcached.MemcachedCache’,

‘LOCATION’:’controller:11211′,

}

}

启用认证API版本3

OPENSTACK_KEYSTONE_URL=”http://%s:5000/v3″%OPENSTACK_HOST

启用域支持:

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT=True

配置API版本:

OPENSTACK_API_VERSIONS={

“identity”:3,

“image”:2,

“volume”:2,

}

配置default作为用户通过dashboard创建的默认的域:

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN=”default”

配置user作为用户创建的默认的角色:

OPENSTACK_KEYSTONE_DEFAULT_ROLE=”user”

可选的,可以配置时区:

TIME_ZONE=”TIME_ZONE”

替换掉TIME_ZONE,这里替换为:Asia/chongqing

完成安装:

重启web服务器以及会话存储服务:

# systemctl restart httpd.service memcached.service

验证操作:

使用浏览器连接http://controller/dashboard,如果无法连接,那么就将controller替换为IP地址。如下图;

使用admin或者demo用户和default域认证,如下图,登录成功:

mysqldump给运维的25个小技巧

1、mysqldump 是文本备份还是二进制备份

它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象。它也有 insert 语句来使用数据构成表。

 

2、mysqldump 的语法是什么?

mysqldump -u [uname] -p[pass] –databases[dbname][dbname2] > [backupfile.sql]

 

3、使用 mysqldump 怎样备份所有数据库?

mysqldump -u root -p –all-databases >backupfile.sql

 

4、使用 mysqldump 怎样备份指定的数据库?

mysqldump -u root -p –databases schoolhospital > backupfile.sql

 

5、使用 mysqldump 怎样备份指定的表?

mysqldump –user=root –password=mypassword-h localhost databasename table_name_to_dump table_name_to_dump_2 >dump_only_two_tables_file.sql

 

6、我不想要数据,怎样仅获取 DDL?

mysqldump -u root -p –all-databases–no-data > backupfile.sql

 

7、一次 mysqldump 备份花费多长时间?

这依赖于数据库大小,100GB 大小的数据库可能花费两小时或更长时间

 

8、怎样备份位于其他服务器的远程数据库?

mysqldump -h 172.16.25.126 -u root -ppassdbname > dbname.sql

 

9、–routines 选项的含义是什么?

通过使用 -routines产生的输出包含 CREATEPROCEDURE 和 CREATEFUNCTION 语句用于重新创建routines。如果你有procedures 或 functions 你需要使用这个选项

 

10、怎样列出 mysqldump 中的所有选项?

mysqldump –help

 

11、mysqldump 中常用的选项是?

All-databases

Databases

Routines

Single-transaction (它不会锁住表) – 一直在 innodb databases 中使用

Master-data – 复制 (现在忽略了)

No-data – 它将 dump 一个没有数据的空白数据库

 

12、默认所有的 triggers 都会备份吗?

是的

 

13、single transaction 选项的含义是什么?

–singletransaction 选项避免了 innodb databases 备份期间的任何锁,如果你使用这个选项,在备份期间,没有锁

 

14、使用 mysqldump 备份的常用命令是什么?

nohup mysqldump –socket=mysql.sock–user=user1 –password=pass –single-transaction –flush-logs –master-data=2–all-databases –extended-insert –quick –routines > market_dump.sql 2>market_dump.err &

 

15、使用 mysqldump 怎样压缩一个备份?

注意: 压缩会降低备份的速度

Mysqldump [options] | gzip >backup.sql.gz

 

16、mysqldump 备份大数据库是否是理想的?

依赖于你的硬件,包括可用的内存和硬盘驱动器速度,一个在 5GB 和 20GB 之间适当的数据库大小。 虽然有可能使用  mysqldump 备份 200GB 的数据库,这种单一线程的方法需要时间来执行。

 

17、怎样通过使用 mysqldump 来恢复备份?

使用来源数据的方法

Mysql –u root –p < backup.sql

 

18、在恢复期间我想记录错误到日志中,我也想看看恢复的执行时间?

Time Mysql –u root –p < backup.sql >backup.out 2>&1

 

19、怎样知道恢复是否正在进行?

显示完整的进程列表

 

20、如果数据库是巨大的,你不得不做的事情是?

使用 nohup 在后台运行它

 

21、我是否可以在 windows 上使用 mysqldump 备份然后在 linux 服务器上恢复?

是的

 

22、我怎么传输文件到目标服务器上去?

使用 scp

使用 sftp

使用 winscp

 

23、如果我使用一个巨大的备份文件来源来恢复会发生什么?

如果你的一个数据库备份文件来源,它可能需要很长时间运行。处理这种情况更好的方式是使用 nohup 来在后台运行。也可使用在 unix 中的 screen 代替

 

24、默认情况下,mysqldump 包含 drop 数据库吗?

你需要添加–add-drop-database 选项

 

25、怎样从一个多数据库备份中提取一个数据库备份(假设数据库名字是 test)?

sed -n ‘/^– Current Database: `test`/,/^–Current Database: `/p’ fulldump.sql > test.sql

15个有用的MySQL/MariaDB性能调整和优化技巧

MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS)。它发布于 1995 年(20年前)。它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择。最新的 MySQL 版本是 5.6.25,于 2015 年 5 月 29 日发布。

关于 MySQL 一个有趣的事实是它的名字来自于 Michael Widenius(MySQL 的创始人)的女儿“ My”。尽管有许多关于 MySQL 有趣的传闻,不过本文主要是向你展示一些有用的实践,以帮助你管理你的 MySQL 服务器。

2009 年 4 月,MySQL 被 Oracle 收购。其结果是MySQL 社区分裂,创建了一个叫 MariaDB 的分支 。创建该分支的主要原因是为了保持这个项目可以在 GPL 下的自由。

今天,MySQL 和 MariaDB 是用于类似 WordPress、Joomla、Magento 和其他web 应用程序的最流行的 RDMS 之一(如果不是最多的)。

这篇文章将告诉你一些基本的,但非常有用的关于如何优化 MySQL/MariaDB 性能的技巧。注意,本文假定您已经安装了 MySQL 或 MariaDB。如果你仍然不知道如何在系统上安装它们,你可以按照以下说明去安装:

在 RHEL/CentOS 7 上安装 LAMP

在 Fedora 22 上安装 LAMP

在 Ubuntu 15.04 安装 LAMP

在 Debian 8 上安装 MariaDB

在 Gentoo Linux 上安装 MariaDB

在 Arch Linux 上安装 MariaDB

重要提示: 在开始之前,不要盲目的接受这些建议。每个MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。

你需要明白这些:

MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效。

这篇文章使用 MySQL 5.6 版本。

1. 启用 InnoDB 的每张表一个数据文件设置

首先,有一个重要的解释, InnoDB 是一个存储引擎。MySQL 和 MariaDB 使用InnoDB 作为默认存储引擎。以前,MySQL 使用系统表空间来保存数据库中的表和索引。这意味着服务器唯一的目的就是数据库处理,它们的存储盘不用于其它目的。

InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。

这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。

MySQL 5.6及以上的版本默认启用 innodb_file_per_table。你可以在 /etc/my.cnf 文件中看到。该指令看起来是这样的:

innodb_file_per_table=1

2. 将 MySQL 数据库数据存储到独立分区上

注意:此设置只在 MySQL 上有效, 在 MariaDB 上无效。

有时候操作系统的读/写会降低你 MySQL 服务器的性能,尤其是如果操作系统和数据库的数据位于同一块磁盘上。因此,我建议你使用单独的磁盘(最好是 SSD)用于 MySQL 服务。

要完成这步,你需要将新的磁盘连接到你的计算机/服务器上。对于这篇文章,我假定磁盘挂在到 /dev/sdb。

下一步是准备新的分区:

#fdisk /dev/sdb

现在按 “N” 来创建新的分区。接着按 “P”,使其创建为主分区。在此之后,从 1-4 设置分区号。之后,你可以选择分区大小。这里按 enter。在下一步,你需要配置分区的大小。

如果你希望使用全部的磁盘,再按一次 enter。否则,你可以手动设置新分区的大小。准备就绪后按“w” 保存更改。现在,我们需要为我们的新分区创建一个文件系统。这可以用下面命令轻松地完成:

#mkfs.ext4 /dev/sdb1

现在我们会挂载新分区到一个目录。我在根目录下创建了一个名为 “ssd” 的目录:

#mkdir /ssd/

挂载新分区到刚才创建的目录下:

#mount /dev/sdb1  /ssd/

你可以在 /etc/fstab 文件中添加如下行设置为开机自动挂载:

/dev/sdb1 /ssd ext3 defaults 00

现在我们将MySQL 移动到新磁盘中

首先停止 MySQL 服务:

# service mysqld stop

我建议你​​同时停止 Apache/nginx,以防止任何试图写入数据库的操作:

# service httpd stop

# service nginx stop

现在复制整个 MySQL 目录到新分区中:

#cp /var/lib/mysql /ssd/ -Rp

这可能需要一段时间,具体取决于你的 MySQL 数据库的大小。一旦这个过程完成后重命名 MySQL 目录:

#mv /var/lib/mysql /var/lib/mysql-backup

然后创建一个符号链接:

#ln -s /ssd/mysql /var/lib/mysql

现在启动你的 MySQL 和 web 服务:

# service mysqld start

# service httpd start

# service nginx start

以后你的数据库将使用新的磁盘访问。

3. 优化使用 InnoDB 的缓冲池

InnoDB 引擎在内存中有一个缓冲池用于缓存数据和索引。这当然有助于你更快地执行MySQL/MariaDB 查询语句。选择合适的内存大小需要一些重要的决策并对系统的内存消耗有较多的认识。

下面是你需要考虑的:

其它的进程需要消耗多少内存。这包括你的系统进程,页表,套接字缓冲。

你的服务器是否专门用于 MySQL 还是你运行着其它非常消耗内存的服务。

在一个专用的机器上,你可能会把 60-70%的内存分配给 innodb_buffer_pool_size。如果你打算在一个机器上运行更多的服务,你应该重新考虑专门用于 innodb_buffer_pool_size 的内存大小。

你需要设置 my.cnf 中的此项:

innodb_buffer_pool_size

4. 在 MySQL 中避免使用 Swappiness

“交换”是一个当系统移动部分内存到一个称为“交换空间” 的特殊磁盘空间时的过程。通常当你的系统用完物理内存后就会出现这种情况,系统将信息写入磁盘而不是释放一些内存。正如你猜测的磁盘比你的内存要慢得多。

该选项默认情况下是启用的:

#sysctl vm.swappiness

 

vm.swappiness= 60

运行以下命令关闭 swappiness:

#sysctl -w vm.swappiness=0

5. 设置 MySQL 的最大连接数

max_connections 指令告诉你当前你的服务器允许多少并发连接。MySQL/MariaDB 服务器允许有 SUPER 权限的用户在最大连接之外再建立一个连接。只有当执行 MySQL 请求的时候才会建立连接,执行完成后会关闭连接并被新的连接取代。

请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

你可以动态地改变 max_connections 的值而无需重启MySQL服务器:

# mysql -u root -p

mysql>setglobal max_connections = 300;

6. 配置 MySQL 的线程缓存数量

thread_cache_size 指令用来设置你服务器缓存的线程数量。当客户端断开连接时,如果当前线程数小于thread_cache_size,它的线程将被放入缓存中。下一个请求通过使用缓存池中的线程来完成。

要提高服务器的性能,你可以设置 thread_cache_size 的值相对高一些。你可以通过以下方法来查看线程缓存命中率:

mysql>show status like ‘Threads_created’;

mysql>show status like ‘Connections’;

你可以用以下公式来计算线程池的命中率:

100 – ((Threads_created / Connections) * 100)

如果你得到一个较低的数字,这意味着大多数mysql 连接使用新的线程,而不是从缓存加载。在这种情况下,你需要增加thread_cache_size

这里有一个好处是可以动态地改变 thread_cache_size 而无需重启 MySQL 服务。你可以通过以下方式来实现:

mysql>setglobal thread_cache_size = 16;

7. 禁用 MySQL 的 DNS 反向查询

默认情况下当新的连接出现时,MySQL/MariaDB会进行 DNS 查询解析用户的 IP 地址/主机名。对于每个客户端连接,它的 IP 都会被解析为主机名。然后,主机名又被反解析为 IP 来验证两者是否一致。

当 DNS 配置错误或服务器出现问题时,这很可能会导致延迟。这就是为什么要关闭 DNS 的反向查询的原因,你可以在你的配置文件中添加以下选项去设定:

[mysqld]

#Skip reverse DNS lookup of clients

skip-name-resolve

更改后你需要重启 MySQL 服务。

8. 配置 MySQL 的查询缓存容量

如果你有很多重复的查询并且数据不经常改变 – 请使用缓存查询。人们常常不理解 query_cache_size 的实际含义而将此值设置为 GB 级,这实际上会降低服务器的性能。

背后的原因是,在更新过程中线程需要锁定缓存。通常设置为 200-300 MB应该足够了。如果你的网站比较小的,你可以尝试给 64M 并在以后及时去增加。

在你的 MySQL 配置文件中添加以下设置:

query_cache_type= 1

query_cache_limit= 256K

query_cache_min_res_unit= 2k

query_cache_size= 80M

9. 配置临时表容量和内存表最大容量

tmp_table_size 和 max_heap_table_size 这两个变量的大小应该相同,它们可以让你避免磁盘写入。tmp_table_size 是内置内存表的最大空间。如果表的大小超出限值将会被转换为磁盘上的 MyISAM 表。

这会影响数据库的性能。管理员通常建议在服务器上设置这两个值为每 GB 内存给 64M。

[mysqld]

tmp_table_size=64M

max_heap_table_size=64M

10. 启用 MySQL 慢查询日志

记录慢查询可以帮助你定位数据库中的问题并帮助你调试。这可以通过在你的 MySQL 配置文件中添加以下值来启用:

slow-query-log= 1

slow-query-log-file = /var/lib/mysql/mysql-slow.log

long_query_time= 1

第一个变量启用慢查询日志,第二个告诉 MySQL 实际的日志文件存储位置。使用 long_query_time 来定义完成 MySQL 查询多少用时算长。

11. 检查 MySQL 的空闲连接

空闲连接会消耗资源,可以的话应该被终止或者刷新。空闲连接是指处于 “sleep” 状态并且保持了很长一段时间的连接。你可以通过运行以下命令查看空闲连接:

# mysqladmin processlist -u root -p | grep “Sleep”

这会显示处于睡眠状态的进程列表。当代码使用持久连接到数据库时会出现这种情况。使用 PHP 调用 mysql_pconnect 可以打开这个连接,执行完查询之后,删除认证信息并保持连接为打开状态。这会导致每个线程的缓冲都被保存在内存中,直到该线程结束。

首先你要做的就是检查代码问题并修复它。如果你不能访问正在运行的代码,你可以修改 wait_timeout 变量。默认值是 28800 秒,而你可以安全地将其降低到 60 :

wait_timeout=60

12. 为 MySQL 选择正确的文件系统

选择正确的文件系统对数据库至关重要。在这里你需要考虑的最重要的事情是 – 数据的完整性,性能和易管理性。

按照 MariaDB 的建议,最好的文件系统是XFS、ext4 和 Btrfs。它们都是可以使用超大文件和大容量存储卷的企业级日志型文件系统。

下面你可以找到一些关于这三个文件系统的有用信息:

文件系统 XFS Ext4 Btrfs
文件系统最大容量 8EB 1EB 16EB
最大文件大小 8EB 16TB 16EB

我们的这篇文章详细介绍了 Linux 文件系统的利与弊: Linux 文件系统解析

13. 设置 MySQL 允许的最大数据包

MySQL 把数据拆分成包。通常一个包就是发送到客户端的一行数据。max_allowed_pa​​cket 变量定义了可以被发送的最大的包。

此值设置得过低可能会导致查询速度变得非常慢,然后你会在 MySQL 的错误日志看到一个错误。建议将该值设置为最大包的大小。

14. 测试 MySQL 的性能优化

你应该定期检查 MySQL/MariaDB 的性能。这将帮助你了解资源的使用情况是否发生了改变或需要进行改进。

有大量的测试工具可用,但我推荐你一个简单易用的。该工具被称为 mysqltuner。

使用下面的命令下载并运行它:

#wget https://github.com/major/MySQLTuner-perl/tarball/master

#tar xf master

#cd major-MySQLTuner-perl-993bc18/

# ./mysqltuner.pl

你将收到有关 MySQL 使用的详细报告和推荐提示。下面是默认 MariaDB 安装的输出样例:

15. 优化和修复 MySQL 数据库

有时候 MySQL/MariaDB 数据库中的表很容易崩溃,尤其是服务器意外关机、文件系统突然崩溃或复制过程中仍然访问数据库。幸运的是,有一个称为 ‘mysqlcheck’ 的免费开源工具,它会自动检查、修复和优化 Linux 中数据库的所有表。

# mysqlcheck -u root -p –auto-repair –check –optimize–all-databases

# mysqlcheck -u root -p –auto-repair –check –optimizedatabasename

就是这些!我希望上述文章对你有用,并帮助你优化你的MySQL 服务器。一如往常,如果你有任何疑问或评论,请在下面的评论部分提交。

超简单将Centos的yum源更换为国内的阿里云源

1、备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/

CentOS 5

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

CentOS 6

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

CentOS 7

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、之后运行yum makecache生成缓存

nginx,apache开启文件目录浏览功能

我们都知道在apache下可以配置访问web服务器的某个路径时,自动显示其目录下面的文件列表的,其实Nginx一点也不比apache弱,它当然也可以实现这个功能,而且还非常容易和简单;主要用到autoindex 这个参数来开启,其配置如下:

复制代码代码如下:
location / {
root /data/www/file                     //指定实际目录绝对路径;
autoindex on;                            //开启目录浏览功能;
autoindex_exact_size off;            //关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_localtime on;              //开启以服务器本地时区显示文件修改日期!
}

如上配置后,用IE访问该服务器的根目录,就会显示出 /data/www/file目录下的所有文件列表,Nginx目录浏览效果图:

为了备忘,最后将apache下的配置方法也记录一下!实现效果和上面一样!

复制代码代码如下:
Alias / ”/data/www/file”
< Directory  ”/data/www/file” >
Options Indexes                                               //开启目录列表索引模式
Order allow,deny
IndexOptions  NameWidth = 25   Charset = UTF -8     //设定文件名显示长度,文字字符编码
Allow from all
</ Directory >