• 关于

    服务器raid5怎么分区

    的搜索结果

回答

回 2楼(zc_0101) 的帖子 您好,       您的问题非常好,SQL SERVER提供了很多关于I/O压力的性能计数器,请选择性能计算器PhysicalDisk(LogicalDisk),根据我们的经验,如下指标的阈值可以帮助你判断IO是否存在压力: 1.  % Disk Time :这个是磁盘时间百分比,这个平均值应该在85%以下 2.  Current Disk Queue Length:未完成磁盘请求数量,这个每个磁盘平均值应该小于2. 3.  Avg. Disk Queue Length:磁盘请求队列的平均长度,这个每个磁盘平均值也应该小于2 4.  Disk Transfers/sec:每次磁盘传输数量,这个每个磁盘的最大值应该小于100 5.  Disk Bytes/sec:每次磁盘传入字节数,这个在普通的磁盘上应该在10M左右 6.  Avg. Disk Sec/Read:从磁盘读取的平均时间,这个平均值应该小于10ms(毫秒) 7.  Avg. Disk Sec/Write:磁盘写入的平均时间,这个平均值也应该小于10ms(毫秒) 以上,请根据自己的磁盘系统判断,比如传统的机械臂磁盘和SSD有所不同。 一般磁盘的优化方向是: 1. 硬件优化:比如使用更合理的RAID阵列,使用更快的磁盘驱动器,添加更多的内存 2. 数据库设置优化:比如创建多个文件和文件组,表的INDEX和数据放到不同的DISK上,将数据库的日志放到单独的物理驱动器,使用分区表 3. 数据库应用优化:包括应用程序的设计,SQL语句的调整,表的设计的合理性,INDEX创建的合理性,涉及的范围很广 希望对您有所帮助,谢谢! ------------------------- 回 3楼(鹰舞) 的帖子 您好,      根据您的描述,由于查询产生了副本REDO LOG延迟,出现了架构锁。我们知道SQL SERVER 2012 AlwaysOn在某些数据库行为上有较多变化。我们先看看架构锁: 架构锁分成两类: 1. SCH-M:架构更改锁,主要发生在数据库SCHEMA的修改上,从你的描述看,没有更改SCHEMA,那么可以排除这个因素 2. SCH-S:架构稳定锁,主要发生在数据库的查询编译等活动 根据你的情况,应该属于SCH-S导致的。查询编译活动主要发生有新增加了INDEX, 更新了统计信息,未参数化的SQL语句等等 对于INDEX和SQL语句方面应,我想应该不会有太多问题。 我们重点关注一下统计信息:SQL SERVER 2012 AG副本的统计信息维护有两种: 1. 主体下发到副本 2. 临时统计信息存储在TEMPDB 对于主体下发的,我们可以设置统计信息的更新行为,自动更新时,可以设置为异步的(自动更新统计信息必须首先打开): USE [master] GO ALTER DATABASE [Test_01]     SET AUTO_UPDATE_STATISTICS_ASYNC ON WITH NO_WAIT GO 这样的话查询优化器不等待统计信息更新完成即编译查询。可以优化一下你的BLOCK。 对于临时统计信息存储在TEMPDB里面也是很重要的,再加上ALWAYSON的副本数据库默认是快照隔离,优化TEMPDB也是必要的,关于优化TEPDB这个我想大部分都知道,这里只是提醒一下。 除了从统计信息本身来解决,在查询过程中,可以降低查询的时间,以尽量减少LOCK的时间和范围,这需要优化你的SQL语句或者应用程序。 以上,希望对您有所帮助。谢谢! ------------------------- 回 4楼(leamonjxl) 的帖子 这是一个关于死锁的问题,为了能够提供帮助一些。请根据下列建议进行: 1.    跟踪死锁 2.    分析死锁链和原因 3.    一些解决办法 关于跟踪死锁,我们首先需要打开1222标记,例如DBCC TRACEON(1222,-1), 他将收集的信息写入到死锁事件发生的服务器上的日志文件中。同时建议打开Profiler的跟踪信息: 如果发生了死锁,需要分析死锁发生的根源在哪里?我们不是很清楚你的具体发生死锁的形态是怎么样的。 关于死锁的实例也多,这里不再举例。 这里只是提出一些可以解决的思路: 1.    减少锁的争用 2.    减少资源的访问数 3.    按照相同的时间顺序访问资源 减少锁的争用,可以从几个方面入手 1.    使用锁提示,比如为查询语句添加WITH (NOLOCK), 但这还取决于你的应用是否允许,大部分分布式的系统都是可以加WITH (NOLOCK), 金融行业可能需要慎重。 2.    调整隔离级别,使用MVCC,我们的数据库默认级别是READ COMMITED. 建议修改为读提交快照隔离级别,这样的话可以尽量读写不阻塞,只不过MVCC的ROW VERSION保存到TEMPDB下面,需要维护好TEMPDB。当然如果你的整个数据库隔离级别可以设置为READUNCOMMINTED,这些就不必了。 减少资源的访问数,可以从如下几个方面入手: 1.    使用聚集索引,非聚集INDEX的叶子页面与堆或者聚集INDEX的数据页面分离。因此,如果对非聚集INDEX 操作的话,会产生两个锁,一个是基本表,一个是非聚集INDEX。而聚集INDEX就不一样,聚集INDEX的叶子页面和表的数据页面相同,他只需要一个LOCK。 2.    查询语句尽量使用覆盖INDEX, 使用全覆盖INDEX,就不需要访问基本表。如果没有全覆盖,还会通过RID或者CLUSTER INDEX访问基本表,这样产生的LOCK可能会与其他SESSION争用。 按照相同的时间顺序访问资源: 确保每个事务按照相同的物理顺序访问资源。两个事务按照相同的物理顺序访问,第一个事务会获得资源上的锁而不会被第二个事务阻塞。第二个事务想获得第一个事务上的LOCK,但被第一个事务阻塞。这样的话就不会导致循环阻塞的情况。 ------------------------- 回 4楼(leamonjxl) 的帖子 两种方式看你的业务怎么应用。这里不仅是分表的问题,还可能存在分库,分服务器的问题。取决与你的架构方案。 物理分表+视图,这是一种典型的冷热数据分离的方案,大致的做法如下: 1.    保留最近3个月的数据为当前表,也即就是我们说的热数据 2.    将其他数据按照某种规则分表,比如按照年或者季度或者月,这部分是相对冷的数据 分表后,涉及到几个问题: 第一问题是,转移数据的过程,一般是晚上业务比较闲来转移,转移按照一定的规则来做,始终保持3个月,这个定时任务本身也很消耗时间 再者,关于查询部分,我想你们的数据库服务器应该通过REPLICATION做了读写分离的吧,主库我觉得压力不会太大,主要是插入或者更新,只读需要做视图来包含全部的数据,但通过UNION ALL所有分表的数据,最后可能还是非常大,在某些情况下,性能不一定好。这个是不是业务上可以解决。比如,对于1年前的历史数据,放在单独的只读上,相对热的数据放在一起,这样压力也会减少。 分区表的话,因为涉及到10亿数据,要有好的分区方案,相对比较简单一点。但对于10亿的大表,始终是个棘手的问题,无论分多少个分区,单个服务器的资源也是有限的。可扩展性方面也存在问题,比如在只读上你没有办法做服务器级别的拆分了。这可能也会造成瓶颈。 现在很多企业都在做分库分表,这些的要解决一些高并发,数据量大的问题。不知是否考虑过类似于中间件的方案,比如阿里巴巴的TDDL类似的方案,如果你有兴趣,可以查询相关资料。 ------------------------- 回 9楼(jiangnii) 的帖子 阿里云数据库不仅提供一个数据库,还提供数据库一种服务。阿里云数据库不仅简化了基础架构的部署,还提供了数据库高可用性架构,备份服务,性能诊断服务,监控服务,专家服务等等,保证用户放心、方便、省心地使用数据库,就像水电一样。以前的运维繁琐的事,全部由阿里云接管,用户只需要关注数据库的使用和具体的业务就好。 关于优化和在云数据库上处理大数据量或复杂的数据操作方面,在云数据库上是一样的,没有什么特别的地方,不过我们的云数据库是使用SSD磁盘,这个比普通的磁盘要快很多,IO上有很大的优势。目前单个实例支持1T的数据量大小。陆续我们会推出更多的服务,比如索引诊断,连接诊断,容量分析,空间诊断等等,这些工作可能是专业的DBA才能完成的,以后我们会提供自动化的服务来为客户创造价值,希望能帮助到客户。 谢谢! ------------------------- 回 12楼(daniellin17) 的帖子 这个问题我不知道是否是两个问题,一个是并行度,另一个是并发,我更多理解是吞吐量,单就并行度而言。 提高并行度需要考虑的因素有: 1.    可用于SQL SERVER的CPU数量 2.    SQL SERVER的版本(32位/64位) 3.    可用内存 4.    执行的查询类型 5.    给定的流中处理的行数 6.    活动的并发连接数量 7.    sys.configurations参数:affinity mask/max server memory (MB)/ max degree of parallelism/ cost threshold for parallelism 以DOP的参数控制并行度为例,设置如下: SELECT * FROM sys.configurations WITH (NOLOCK) WHERE name = 'max degree of parallelism' EXEC sp_configure 'max degree of parallelism',2 RECONFIGURE WITH OVERRIDE 经过测试,DOP设置为2是一个比较适中的状态,特别是OLTP应用。如果设置高了,会产生较多的SUSPEND进程。我们可以观察到资源等待资源类型是:CXPACKET 你可以用下列语句去测试: DBCC SQLPERF('sys.dm_os_wait_stats',CLEAR) SELECT * FROM sys.dm_os_wait_stats WITH (NOLOCK) ORDER BY 2 DESC ,3 DESC 如果是吞吐量的话。优化的范围就很广了。优化是系统性的。硬件配置我们选择的话,大多根据业务量来预估,然后考虑以下: 1.    RAID的划分,RAID1适合存放事务日志文件(顺序写),RAID10/RAID5适合做数据盘,RAID10是条带化并镜像,RAID5条带化并奇偶校验 2.    数据库设置,比如并行度,连接数,BUFFER POOL 3.    数据库文件和日志文件的存放规则,数据库文件的多文件设置规则 4.    TEMPDB的优化原则,这个很重要的 5.    表的设计方面根据业务类型而定 6.    CLUSTERED INDEX和NONCLUSTERED INDEX的设计 7.    阻塞分析 8.    锁和死锁分析 9.    执行计划缓冲分析 10.    存储过程重编译 11.    碎片分析 12.    查询性能分析,这个有很多可以优化的方式,比如OR/UNION/类型转换/列上使用函数等等 我这里列举一个高并发的场景: 比如,我们的订单,比如搞活动的时候,订单刷刷刷地增长,单个实例可能每秒达到很高很高,我们分析到最后最常见的问题是HOT PAGE问题,其等待类型是PAGE LATCH竞争。这个过程可以这么来处理,简单列几点,可以参考很多涉及高并发的案例: 1.    数据库文件和日志文件分开,存放在不同的物理驱动器磁盘上 2.    数据库文件需要与CPU个数形成一定的比例 3.    表设计可以使用HASH来作为表分区 4.    表可以设置无序的KEY/INDEX,比如使用GUID/HASH VALUE来定义PRIMARY KEY CLUSTER INDEX 5.    我们不能将自增列设计为聚集INDEX 这个场景只是针对高并发的插入。对于查询而言,是不适合的。但这些也可能导致大量的页拆分。只是在不同的场景有不同的设计思路。这里抛砖引玉。 ------------------------- 回 13楼(zuijh) 的帖子 ECS上现在有两种磁盘,一种是传统的机械臂磁盘,另一种是SSD,请先诊断你的IO是否出现了问题,本帖中有提到如何判断磁盘出现问题的相关话题,请参考。如果确定IO出现问题,可以尝试使用ECS LOCAL SSD。当然,我们欢迎你使用云数据库的产品,云数据库提供了很多有用的功能,比如高可用性,灵活的备份方案,灵活的弹性方案,实用的监控报警等等。 ------------------------- 回 17楼(豪杰本疯子) 的帖子 我们单个主机或者单个实例的资源总是有限的,因为涉及到很大的数据量,对于存储而言是个瓶颈,我曾使用过SAN和SAS存储,SAN存储的优势确实可以解决数据的灵活扩展,但是SAN也分IPSAN和FIBER SAN,如果IPSAN的话,性能会差一些。即使是FIBER SAN,也不是很好解决性能问题,这不是它的优势,同时,我们所有DB SERVER都连接到SAN上,如果SAN有问题,问题涉及的面就很广。但是SAS毕竟空间也是有限的。最终也会到瓶颈。数据量大,是造成性能问题的直接原因,因为我们不管怎么优化,一旦数据量太大,优化的能力总是有限的,所以这个时候更多从架构上考虑。单个主机单个实例肯定是抗不过来的。 所以现在很多企业在向分布式系统发展,对于数据库而言,其实有很多形式。我们最常见的是读写分离,比如SQL SERVER而言,我们可以通过复制来完成读写分离,SQL SERVER 2012及以后的版本,我们可以使用ALWAYSON来实现读写分离,但这只能解决性能问题,那空间问题怎么解决。我们就涉及到分库分表,这个分库分表跟应用结合得紧密,现在很多公司通过中间件来实现,比如TDDL。但是中间件不是每个公司都可以玩得转的。因此可以将业务垂直拆分,那么DB也可以由此拆分开来。举个简单例子,我们一个典型的电子商务系统,有订单,有促销,有仓库,有配送,有财务,有秒杀,有商品等等,很多公司在初期,都是将这些放在一个主机一个实例上。但是这些到了一定规模或者一定数据量后,就会出现性能和硬件资源问题,这时我们可以将它们独立一部分获完全独立出来。这些都是一些好的方向。希望对你有所帮助。 ------------------------- 回 21楼(dt) 的帖子 问: 求大数据量下mysql存储,优化方案 分区好还是分表好,分的过程中需要考虑事项 mysql高并发读写的一些解决办法 答: 分区:对于应用来说比较简单,改造较少 分表: 应用需较多改造,优点是数据量太大的情况下,分表可以拆分到多个实例上,而分区不可以。 高并发优化,有两个建议: 1.    优化事务逻辑 2.    解决mysql高并发热点,这个可以看看阿里的一个热点补丁: http://www.open-open.com/doc/view/d58cadb4fb68429587634a77f93aa13f ------------------------- 回 23楼(aelven) 的帖子 对于第一个问题.需要看看你的数据库架构是什么样的?比如你的架构具有高可用行?具有读写分离的架构?具有群集的架构.数据库应用是否有较冷门的功能。高并发应该不是什么问题。可扩展性方面需要考虑。阿里云数据库提供了很多优势,比如磁盘是性能超好的SSD,自动转移的高可用性,没有任何单点,自动灵活的备份方案,实用的监控报警,性能监控服务等等,省去DBA很多基础性工作。 你第二个问题,看起来是一个高并发的场景,这种高并发的场景容易出现大量的LOCK甚至死锁,我不是很清楚你的业务,但可以建议一下,首先可以考虑快照隔离级别,实现行多版本控制,让读写不要阻塞。至于写写过程,需要加锁的粒度降低最低,同时这种高并发也容易出现死锁,关于死锁的分析,本帖有提到,请关注。 第三个问题,你用ECS搭建自己的应用也是可以的,RDS数据库提供了很多功能,上面已经讲到了。安全问题一直是我们最看重的问题,肯定有超好的防护的。 ------------------------- 回 26楼(板砖大叔) 的帖子 我曾经整理的关于索引的设计与规范,可以供你参考: ----------------------------------------------------------------------- 索引设计与规范 1.1    使用索引 SQL SERVER没有索引也可以检索数据,只不过检索数据时扫描这个表而异。存储数据的目的,绝大多数都是为了再次使用,而一般数据检索都是带条件的检索,数据查询在数据库操作中会占用较大的比例,提高查询的效率往往意味着整个数据库性能的提升。索引是特定列的有序集合。索引使用B-树结构,最小优化了定位所需要的键值的访问页面量,包含聚集索引和非聚集索引两大类。聚集索引与数据存放在一起,它决定表中数据存储的物理顺序,其叶子节点为数据行。 1.2    聚集索引 1.2.1    关于聚集索引 没聚集索引的表叫堆。堆是一种没有加工的数据,以行标示符作为指向数据存储位置的指针,数据没有顺序。聚集索引的叶子页面和表的数据页面相同,因此表行物理上按照聚集索引列排序,表数据的物理顺序只有一种,所以一个表只有一个聚集索引。 1.2.2    与非聚集索引关系 非聚集索引的一个索引行包含指向表对应行的指针,这个指针称为行定位器,行定位器的值取决于数据页保存为堆还是被聚集。若是堆,行定位器指向的堆中数据行的行号指针,若是聚集索引表,行定位器是聚集索引键值。 1.2.3    设计聚集索引注意事项     首先创建聚集索引     聚集索引上的列需要足够短     一步重建索引,不要使用先DROP再CREATE,可使用DROP_EXISTING     检索一定范围和预先排序数据时使用,因为聚集索引的叶子与数据页面相同,索引顺序也是数据物理顺序,读取数据时,磁头是按照顺序读取,而不是随机定位读取数据。     在频繁更新的列上不要设计聚集索引,他将导致所有的非聚集所有的更新,阻塞非聚集索引的查询     不要使用太长的关键字,因为非聚集索引实际包含了聚集索引值     不要在太多并发度高的顺序插入,这将导致页面分割,设置合理的填充因子是个不错的选择 1.3    非聚集索引 1.3.1    关于非聚集索引 非聚集索引不影响表页面中数据的顺序,其叶子页面和表的数据页面时分离的,需要一个行定位器来导航数据,在将聚集索引时已经有说明,非聚集索引在读取少量数据行时特别有效。非聚集索引所有可以有多个。同时非聚集有很多其他衍生出来的索引类型,比如覆盖索引,过滤索引等。 1.3.2    设计非聚集索引     频繁更新的列,不适合做聚集索引,但可以做非聚集索引     宽关键字,例如很宽的一列或者一组列,不适合做聚集索引的列可作非聚集索引列     检索大量的行不宜做非聚集索引,但是可以使用覆盖索引来消除这种影响 1.3.3    优化书签查找 书签会访问索引之外的数据,在堆表,书签查找会根据RID号去访问数据,若是聚集索引表,一般根据聚集索引去查找。在查询数据时,要分两个部分来完成,增加了读取数据的开销,增加了CPU的压力。在大表中,索引页面和数据页面一般不会临近,若数据只存在磁盘,产生直接随机从磁盘读取,这导致更多的消耗。因此,根据实际需要优化书签查找。解决书签查找有如下方法:     使用聚集索引避免书签查找     使用覆盖索引避免书签查找     使用索引连接避免数据查找 1.4    聚集与非聚集之比较 1.4.1    检索的数据行 一般地,检索数据量大的一般使用聚集索引,因为聚集索引的叶子页面与数据页面在相同。相反,检索少量的数据可能非聚集索引更有利,但注意书签查找消耗资源的力度,不过可考虑覆盖索引解决这个问题。 1.4.2    数据是否排序 如果数据需要预先排序,需要使用聚集索引,若不需要预先排序就那就选择聚集索引。 1.4.3    索引键的宽度 索引键如果太宽,不仅会影响数据查询性能,还影响非聚集索引,因此,若索引键比较小,可以作为聚集索引,如果索引键够大,考虑非聚集索引,如果很大的话,可以用INCLUDE创建覆盖索引。 1.4.4    列更新的频度 列更新频率高的话,应该避免考虑所用非聚集索引,否则可考虑聚集索引。 1.4.5    书签查找开销 如果书签查找开销较大,应该考虑聚集索引,否则可使用非聚集索引,更佳是使用覆盖索引,不过得根据具体的查询语句而看。 1.5    覆盖索引 覆盖索引可显著减少查询的逻辑读次数,使用INCLUDE语句添加列的方式更容易实现,他不仅减小索引中索引列的数据,还可以减少索引键的大小,原因是包含列只保存在索引的叶子级别上,而不是索引的叶子页面。覆盖索引充当一个伪的聚集索引。覆盖索引还能够有效的减少阻塞和死锁的发生,与聚集索引类似,因为聚集索引值发生一次锁,非覆盖索引可能发生两次,一次锁数据,一次锁索引,以确保数据的一致性。覆盖索引相当于数据的一个拷贝,与数据页面隔离,因此也只发生一次锁。 1.6    索引交叉 如果一个表有多个索引,那么可以拥有多个索引来执行一个查询,根据每个索引检索小的结果集,然后就将子结果集做一个交叉,得到满足条件的那些数据行。这种技术可以解决覆盖索引中没有包含的数据。 1.7    索引连接 几乎是跟索引交叉类似,是一个衍生品种。他将覆盖索引应用到交叉索引。如果没有单个覆盖索引查询的索引而多个索引一起覆盖查询,SQL SERVER可以使用索引连接来完全满足查询而不需要查询基础表。 1.8    过滤索引 用来在可能没有好的选择性的一个或者多个列上创建一个高选择性的关键字组。例如在处理NULL问题比较有效,创建索引时,可以像写T-SQL语句一样加个WHERE条件,以排除某部分数据而检索。 1.9    索引视图 索引视图在OLAP系统上可能有胜算,在OLTP会产生过大的开销和不可操作性,比如索引视图要求引用当前数据库的表。索引视图需要绑定基础表的架构,索引视图要求企业版,这些限制导致不可操作性。 1.10    索引设计建议 1.10.1    检查WHERE字句和连接条件列 检查WHERE条件列的可选择性和数据密度,根据条件创建索引。一般地,连接条件上应当考虑创建索引,这个涉及到连接技术,暂时不说明。 1.10.2    使用窄的索引 窄的索引有可减少IO开销,读取更少量的数据页。并且缓存更少的索引页面,减少内存中索引页面的逻辑读取大小。当然,磁盘空间也会相应地减少。 1.10.3    检查列的唯一性 数据分布比较集中的列,种类比较少的列上创建索引的有效性比较差,如果性别只有男女之分,最多还有个UNKNOWN,单独在上面创建索引可能效果不好,但是他们可以为覆盖索引做出贡献。 1.10.4    检查列的数据类型 索引的数据类型是很重要的,在整数类型上创建的索引比在字符类型上创建索引更有效。同一类型,在数据长度较小的类型上创建又比在长度较长的类型上更有效。 1.10.5    考虑列的顺序 对于包含多个列的索引,列顺序很重要。索引键值在索引上的第一上排序,然后在前一列的每个值的下一列做子排序,符合索引的第一列通常为该索引的前沿。同时要考虑列的唯一性,列宽度,列的数据类型来做权衡。 1.10.6    考虑索引的类型 使用索引类型前面已经有较多的介绍,怎么选择已经给出。不再累述。 ------------------------- 回 27楼(板砖大叔) 的帖子 这两种都可以吧。看个人的喜好,不过微软现在的统一风格是下划线,比如表sys.all_columns/sys.tables,然后你再看他的列全是下划线连接,name     /object_id    /principal_id    /schema_id    /parent_object_id      /type    /type_desc    /create_date    /modify_date 我个人的喜好也是喜欢下划线。    
石沫 2019-12-02 01:34:30 0 浏览量 回答数 0

回答

、安装前的准备 1. 安装方式选择 OceanBase是一个集群数据库,至少要三个节点。通常三个节点是要在三台机器上。有关OceanBase的介绍请参考官网 http://oceanbase.alipay.com/docs 。 官网上提供了一个安装包的下载,地址是: OceanBase安装包下载链接 。 这个安装包里的内容很多。很大一部分是OCP的安装包以及相关安装说明。详细查看 安装包组件说明 。 我们只需要里面的2个文件。 $unzip ocp-release.zip $cd ocp-release/ $tar zxvf ocp-setup.tar.gz $cd ocp_yh $ls -lrth obproxy-1.3.3-1506155.el7.x86_64.rpm oceanbase-1.4.60-1571952.el7.x86_64.rpm -rwxr-xr-x 1 admin admin 36M May 11 2018 oceanbase-1.4.60-1571952.el7.x86_64.rpm -rwxr-xr-x 1 admin admin 5.4M May 11 2018 obproxy-1.3.3-1506155.el7.x86_64.rpm 这两个文件就是我们后面安装需要的。一个是observer的安装包,一个是obproxy的安装包。 由于环境的权限限制,服务器之间不能直接打通ssh通道,并且默认也不允许开启80端口和图形化界面,导致我无法使用官网推荐的2种方式安装。于是,我就一步步从命令行下安装OceanBase集群。从这个步骤里也可以看出一些OceanBase的原理。 实际过程并不复杂,很容易掌握。 部署要求 项目 描述 机型要求 建议物理机。如果是vmware虚拟出来的虚拟机也行,只是cpu、内存和磁盘不要太低。 操作系统 推荐redhat 7.2, centos 7.2 。 7.x 应该也可以。具体问题具体分析。 内存 推荐64G以上,生产环境建议256G以上。如果只是研究功能 8G以上。比这个还小,后面使用不熟悉的话,会误以为有很多问题。 磁盘 推荐普通ssd即可,生产环境也不需要高密度ssd盘。如果只是研究功能,用sata或sas也行。就是性能会不怎么好(其他数据库同理)。 磁盘空间 内存的4倍以上。生产环境建议1T以上。 如果只是研究功能,至少也要100G以上。比这个还小,后面使用不熟悉的话,会误以为有问题。 文件系统 ext4, xfs都可以。 网卡 推荐千兆互联以上。生产环境建议万兆互联。节点间的网络延时对OB的性能会有很大影响,所有的分布式产品都如此。 CPU 至少16核以上,生产环境建议32核以上。cpu太少,没法体验OB的多租户功能。 3. OS环境准备 这里就参见官方文档 修改操作系统配置 ,挑几个重要的提一下。 ulimit用于限制shell启动进程所占用的资源。有两种方法可以修改资源限制,一种是通过启动时session级别指定,另外一种是修改/etc/security/limits.conf配置文件,全局生效。 OBServer进程涉及的几个限制包括线程最大栈空间大小(stack),最大文件句柄数(openfiles),core文件大小(core file size)。 [size=font-size: 10.5pt,10.5pt]$vi /etc/security/limits.conf添加 [size=font-size: 10.5pt,10.5pt]*  soft  nofile  655350 [size=font-size: 10.5pt,10.5pt]*  hard  nofile  655350 [size=font-size: 10.5pt,10.5pt]*  soft  stack 20480 [size=font-size: 10.5pt,10.5pt]*  hard stack 20480 [size=font-size: 10.5pt,10.5pt]* soft nproc 655360 [size=font-size: 10.5pt,10.5pt]* hard nproc 655360 [size=font-size: 10.5pt,10.5pt]*  soft  core unlimited [size=font-size: 10.5pt,10.5pt]*  hardcore unlimited 稍微提一下的是目录准备。每个节点都会写数据和日志。根据经验数据和日志盘在底层要分离。如果能在raid层面隔离是最好的。如果做不好,那就用LVM在逻辑层面做隔离(即做不同的LV) 下面是我的环境 $sudo lvs -a LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data vgob -wi-ao---- 10.97t log vgob -wi-ao---- 1.05t $cat /etc/fstab LABEL=log1 /data/log1 ext4 defaults,noatime,nodiratime,nodelalloc,barrier=0 0 0 LABEL=data1 /data/1 xfs defaults,noatime,nodiratime,barrier=0 0 0 sysctl.conf修改 for oceanbase net.core.somaxconn = 2048 net.core.netdev_max_backlog = 10000 net.core.rmem_default = 16777216 net.core.wmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.ip_local_port_range = 3500 65535 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_slow_start_after_idle=0 vm.swappiness = 0 kernel.core_pattern = /data/1/core-%e-%p-%t vm.min_free_kbytes = 2097152 vm.max_map_count=655360 机器准备 IP Zone 描述 xxx.xxx.171.187 zone1 observer 节点,rootservice 所在机器之一 xxx.xxx.241.129 zone1 observer 节点 xxx.xxx.240.24 zone2 observer 节点,rootservice 所在机器之一 xxx.xxx.241.145 zone2 observer 节点 xxx.xxx.241.125 zone3 observer 节点,rootservice 所在机器之一 xxx.xxx.241.159 zone3 observer 节点 xxx.xxx..242.22 NA obproxy 机器,一台就够了,可以部署多台,也可以复用 observer节点。 zone 是对机器的划分。一个oceanbase集群的机器至少划分为三个zone。通常数据至少有三份,分布在每个zone里面。二、安装启动OBServer 安装软件包 OceanBase是一个集群,但是安装却很简单,只需要在每个节点安装一个observer的rpm包(有2个依赖包 snappy和lzo需要先安装一下),然后启动即可。 $sudo yum -y install snappy lzo $sudo rpm -ivh oceanbase-1.4.60-1571952.el7.x86_64.rpm 准备数据库目录 在启动 OBServer之前,需要准备一些数据目录。并且启动用户建议是 admin。 admin需要sudo权限。假设我要搭建的数据库集群叫 obdemo 。下面目录里会用到这个名字。 关于目录结构不多解释,待OB集群搭建成功后大家可以再去研究其目录。 su - admin mkdir -p /data/1/obdemo/ cd /data/1/obdemo/ mkdir -p etc3 sort_dir sstable mkdir -p /data/log1/obdemo/ cd /data/log1/obdemo/ mkdir -p clog etc2 ilog oob_clog slog mkdir -p /home/admin/oceanbase/store/obdemo cd /home/admin/oceanbase/store/obdemo/ ln -s /data/1/obdemo/sort_dir /home/admin/oceanbase/store/obdemo/sort_dir ln -s /data/1/obdemo/sstable /home/admin/oceanbase/store/obdemo/sstable ln -s /data/log1/obdemo/clog /home/admin/oceanbase/store/obdemo/clog ln -s /data/log1/obdemo/ilog /home/admin/oceanbase/store/obdemo/ilog ln -s /data/log1/obdemo/oob_clog /home/admin/oceanbase/store/obdemo/oob_clog ln -s /data/log1/obdemo/slog /home/admin/oceanbase/store/obdemo/slog $ls -lrth /home/admin/oceanbase/store/obdemo/ total 0 lrwxrwxrwx 1 admin admin 23 Oct 6 21:10 sort_dir -> /data/1/obdemo/sort_dir lrwxrwxrwx 1 admin admin 22 Oct 6 21:10 sstable -> /data/1/obdemo/sstable lrwxrwxrwx 1 admin admin 22 Oct 6 21:10 clog -> /data/log1/obdemo/clog lrwxrwxrwx 1 admin admin 22 Oct 6 21:10 ilog -> /data/log1/obdemo/ilog lrwxrwxrwx 1 admin admin 26 Oct 6 21:10 oob_clog -> /data/log1/obdemo/oob_clog lrwxrwxrwx 1 admin admin 22 Oct 6 21:10 slog -> /data/log1/obdemo/slog 从这个目录结构里就可以看出数据和日志是分开存储了。 启动observer 此前规划的6台机器,分属于3个zone。 启动参数 大部分相同,只是zone的名字要改一改。 $bin/observer --help bin/observer --help observer [OPTIONS] -h,--help print this help -z,--zone ZONE zone -p,--mysql_port PORT mysql port -P,--rpc_port PORT rpc port -N,--nodaemon don't run in daemon -n,--appname APPNAME application name -c,--cluster_id ID cluster id -d,--data_dir DIR OceanBase data directory -i,--devname DEV net dev interface -o,--optstr OPTSTR extra options string -r,--rs_list RS_LIST root service list -l,--log_level LOG_LEVEL server log level 所有zone1 机器的observer启动命令: cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i bond0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' -c 2018100601 -n obdemo -o "datafile_disk_percentage=50,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2" 高亮部分都是可以改的。在没有理解之前不要修改。 -n 指定的 appname,就是集群名,后面都会用到。 -r 后面列表里的ip 就是被选为rootservice的三台机器ip。 observer的启动目录必须是 /home/admin/oceanbase 。所以cd 那个命令不要忘记了。 datafile_disk_percentage=50 这个比例可以调整,默认是90(表示90%的磁盘分区空间会被OB占用)。如果你的磁盘空间想留一点给其他应用用。就缩小这个比例。当data和log目录是共用的时候,更要调小这个比例。否则observer启动会因为clog空间不足而失败。 $ps -ef | grep observer admin 62603 1 99 Oct06 ? 2-00:59:16 /home/admin/oceanbase/bin/observer -i bond0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881 -c 2018100601 -n obdemo -o config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2 admin 108165 61410 0 11:30 pts/1 00:00:00 grep --color=auto observer 所有zone2 机器的启动命令: cd /home/admin/oceanbase && bin/observer -i bond0 -P 2882 -p 2881 -z zone2 -d /home/admin/oceanbase/store/obdemo -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' -c 2018100601 -n obdemo -o "config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2" ps -ef | grep observer 所有zone3机器的启动命令 cd /home/admin/oceanbase && bin/observer -i bond0 -P 2882 -p 2881 -z zone3 -d /home/admin/oceanbase/store/obdemo -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' -c 2018100601 -n obdemo -o "config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2" ps -ef | grep observer 此时,只是在每个机器上启动了observer,还并没有形成一个OceanBase集群。后面会初始化一个OceanBase集群。 备注:上面每个observer的启动参数很长,实际上只有第一次启动的时候需要这么写。等后面初始化OceanBase集群成功后,每个observer会自动把它所有参数写到一个配置文件里。默认在 /home/admin/oceanbase/etc/observer.config.bin 里, 这个配置文件很重要,所以observer允许额外通过参数config_additional_dir 指定存储多份,类似于oracle的控制文件。 三、初始化OceanBase集群 前面在每个机器节点上都启动了一个observer,其参数独特之处是都指定了一个 rootservice list。 -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' 这里面有3个ip,是被设计为存储rootservice 的机器。 在初始化oceanbase集群之前,这三台机器里至少有两台机器的observer必须启动,并且以同样的参数启动。初次安装我们默认三台机器的observer都启动了。 清空所有数据文件(第一次不需要) pkill observer 等待几秒钟 /bin/rm /home/admin/oceanbase/log/log cd /data/log1/obdemo && /bin/rm -rf clog etc2 ilog oob_clog slog mkdir clog etc2 ilog oob_clog slog cd /data/1/obdemo && /bin/rm -rf etc3 sort_dir sstable mkdir etc3 sort_dir sstable ll ~/oceanbase/store/obdemo 这个命令是用于清空数据文件,重新执行后面步骤。第一次做的时候不需要(没有历史数据文件)。要做的时候,需要先到所有observer机器上 kill掉 observer,再跑该脚本。 登录observer 选rootservice里任意一个机器登录,登录observer $mysql -h127.1 -uroot -P2881 -p 空密码 此时进来之后,还不能执行 show database命令,因为元数据还没有构建好。 执行 bootstrap 然后在mysql命令行下执行 bootstrap mysql>alter system bootstrap ZONE 'zone1' SERVER 'xxx.xxx.171.187:2882', ZONE 'zone2' SERVER 'xxx.xxx.240.24:2882', ZONE 'zone3' SERVER 'xxx.xxx.241.125:2882'; 这个命令通常几秒钟就返回了。如果没有返回或者很久以后报错timeout了,那说明前面有observer启动参数指定不对。看看是不是zone名称不对,或者rootservicelist里的ip和port跟 -P和-p 指定的port不一致等等。 找到原因解决问题后,执行第1步清空历史数据文件,重头来过。 这一步成功后,一个 1-1-1的OceanBase集群就初始化成功了。此时退出mysql命令行,重新登录的时候就要换下面命令了。 $mysql -h127.1 -uroot@sys -P2881 oceanbase -p 空密码 MySQL [oceanbase]> show databases; +--------------------+ | Database | +--------------------+ | oceanbase | | information_schema | | mysql | | test | +--------------------+ 然而我准备了6台机器用于部署oceanbase集群,所以还需要把其他三台机器加入到 当前集群里。也就是扩容命令了。 扩容oceanbase集群 ALTER SYSTEM ADD SERVER 'ip:port' [,'ip:port'…] [ZONE=’zone_name’]; mysql> alter system add server 'xxx.xxx.241.129:2882' zone='zone1'; mysql> alter system add server 'xxx.xxx.241.145:2882' zone='zone2'; mysql> alter system add server 'xxx.xxx.241.159:2882' zone='zone3'; 注意端口号只需要指定 rpc port(2882), 以及zone不要加错。 加成功后,查看当前server列表 MySQL [oceanbase]> select zone,svr_ip,svr_port,with_rootserver ,build_version from __all_server order by zone, with_rootserver desc; +-------+----------------+----------+-----------------+-------------------------------------------------------------------------------+ | zone | svr_ip | svr_port | with_rootserver | build_version | +-------+----------------+----------+-----------------+-------------------------------------------------------------------------------+ | zone1 | xxx.xxx.171.187 | 2882 | 1 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar 9 2018 14:32:07) | | zone1 | xxx.xxx.241.129 | 2882 | 0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar 9 2018 14:32:07) | | zone2 | xxx.xxx.240.24 | 2882 | 0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar 9 2018 14:32:07) | | zone2 | xxx.xxx.241.145 | 2882 | 0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar 9 2018 14:32:07) | | zone3 | xxx.xxx.241.125 | 2882 | 0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar 9 2018 14:32:07) | | zone3 | xxx.xxx.241.159 | 2882 | 0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar 9 2018 14:32:07) | +-------+----------------+----------+-----------------+-------------------------------------------------------------------------------+ 6 rows in set (0.00 sec) 备注:上面默认root@sys密码是空,生产环境一定要设置复杂密码。 MySQL [oceanbase]> alter user root identified by 'root';四、安装启动反向代理OBProxy 前面装好了一个 2-2-2的OceanBase集群,但是客户端要连接这个数据库集群,前面那种连接方式还不够好。因为要考虑到某个observer节点宕机问题。直连这个observer肯定不好。 此外,由于OceanBase是一个分布式数据库,数据可能分布在多个节点上,但具体在哪个机器上客户端是不知道的,所以需要一个反向代理OBProxy 来负责数据访问路由。 理论上obproxy可以安装在任何机器上。如安装在observer上,或者独立的机器上,或者应用服务器上。并且obproxy由于只做路由功能,非常轻量,无状态,支持安装多个obproxy。安装多个obproxy的时候,可以再前面再通过负载均衡机制(F5或者lvs,slb等)做一个vip,肩负起 obproxy的高可用和负载均衡作用。这样就不怕某个obproxy挂掉或者压力过大了。 安装obproxy rpm包 sudo rpm -ivh obproxy-1.3.3-1506155.el7.x86_64.rpm 目录权限改到admin用户下。 chown -R admin.admin /opt/taobao/install/obproxy 初始化obproxy用户 mysql> CREATE USER proxyro IDENTIFIED BY password '*e9c2bcdc178a99b7b08dd25db58ded2ee5bff050' ; mysql> GRANT SELECT ON . to proxyro; proxyro是个连接observer的只读帐号,obproxy会用到这个帐号。 启动obproxy 第一次启动obproxy的时候,也需要指定一些参数。如rootservice 列表。以及指定监听端口(2883,也可以写别的任意端口,不跟已有端口冲突即可) cd /opt/taobao/install/obproxy && bin/obproxy -r "xxx.xxx.171.187:2881; xxx.xxx.240.24:2881; xxx.xxx.241.125:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false" -c obdemo 查看日志确认是否有异常。 cd /opt/taobao/install/obproxy tail -f log/obproxy.进程号.log 通过obproxy连接一下OceanBase集群 $mysql -h xxx.xxx.242.22 -uroot@sys#obdemo -P2883 -p oceanbase 或者 $mysql -h xxx.xxx.242.22 -uobdemo:sys:root -P2883 -p oceanbase 可以看出 跟连接mysql很像,区别在于 user的格式。 oceanbase的user格式是 “用户名@租户名#集群名” 或者 "集群名:租户名:用户名“ 等。五、分配租户(实例) 前面用6台机器搭建了一个2-2-2的OceanBase集群。现在某个应用需要申请一个数据库。我们并不会直接把这个OceanBase集群给到应用使用。 实际上刚初始化的OceanBase集群默认只有一个sys租户,其规格很小(cpu/memory/disk)。 MySQL [oceanbase]> select * from __all_unit_config where name='sys_unit_config'; +----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+-------------+----------+----------+----------------+---------------------+ | gmt_create | gmt_modified | unit_config_id | name | max_cpu | min_cpu | max_memory | min_memory | max_iops | min_iops | max_disk_size | max_session_num | +----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+-------------+----------+----------+----------------+---------------------+ | 2018-10-06 21:05:49.881126 | 2018-10-06 21:05:49.881126 | 1 | sys_unit_config | 5 | 2.5 | 19423884214 | 16186570178 | 10000 | 5000 | 18578870894592 | 9223372036854775807 | +----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+-------------+----------+----------+----------------+---------------------+ 1 row in set (0.00 sec) 这个sys租户只有 2.5-5个cpu,15-18 G内存的规格。 所以要给业务帐号单独分配一个租户。这也是OceanBase使用的正确姿势。 有关租户、资源池等概念,详情参见 OceanBase开发和运维漫谈 创建资源池规格 create resource unit unit_2c10g512g, max_cpu=2, max_memory='10G', min_memory='10G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size=536870912; create resource unit unit_4c20g1024g, max_cpu=4, max_memory='20G', min_memory='20G', max_iops=20000, min_iops=5000, max_session_num=1000000, max_disk_size=1073741824; create resource unit unit_8c40g2048g, max_cpu=8, max_memory='40G', min_memory='40G', max_iops=50000, min_iops=10000, max_session_num=1000000, max_disk_size=2147483648; 查看资源规格 select * from __all_unit_config; 因为我的测试机器都是物理机,cpu和内存很大,所以我的多个规格定义的资源都比较大。大家可以根据自己情况修改。 分配资源池 create resource pool pool_demo unit = 'unit_16c50g4096g', unit_num = 1; select * from __all_resource_pool order by resource_pool_id desc ; 资源池分配后,只有创建租户并关联它才可以被使用。 创建租户 create tenant t_obdemo resource_pool_list=('pool_demo'); ---- alter tenant t_obdemo set variables ob_tcp_invited_nodes='xxx.xxx.0.0/16,127.0.0.1'; 租户名可以自定义。 注释的alter语句是设置租户连接的白名单,安全性跟高。不过只有在1.4.7版本以后才有。 新租户默认root密码为空。老规矩,首先改密码。 mysql -h xxx.xxx.242.22 -uroot@t_obdemo#obdemo -P2883 oceanbase -A -p alter user root identified by 'root'; 创建应用数据库和帐号 create database sbtest; grant all privileges on sbtest.* to sbuser@'%' identified by 'sbtest'; 连接应用数据库 mysql -h127.1 -usbuser@t_obdemo#obdemo -P2883 sbtest -A -psbtest MySQL [sbtest]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | sbtest | +--------------------+ 2 rows in set (0.02 sec) 总结 OceanBase的安装首先是在各个机器上安装并启动observer,第一次启动时指定rootservice list和相关参数。初始化OceanBase集群。成功后,就可以逐台机器 重启一下observer。关闭方式就是 pkill 或者kill。 着急的话就kill -9 。 启动方式就是 cd /home/admin/oceanbase; bin/observer 第二次启动不需要指定参数,参数都在参数文件里。初始化proxyro用户。安装obproxy软件并启动。第一次启动也要指定rootservice和相关参数。启动成功后可以重启obproxy。关闭方式就是pkill或者kill。启动方式就是 cd /opt/taobao/install/obproxy; bin/obproxy 第二次启动不需要指定参数,参数都在参数文件里。分配资源创建租户在租户里创建业务数据库和帐号。
游客2q7uranxketok 2021-02-24 11:12:22 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT