云服务器内容精选

  • 支持区域 当前已上传OBS数据的区域如表1所示。 表1 区域和OBS桶名 区域 OBS桶名 华北-北京一 dws-demo-cn-north-1 华北-北京二 dws-demo-cn-north-2 华北-北京四 dws-demo-cn-north-4 华北-乌兰察布一 dws-demo-cn-north-9 华东-上海一 dws-demo-cn-east-3 华东-上海二 dws-demo-cn-east-2 华南-广州 dws-demo-cn-south-1 华南-广州友好 dws-demo-cn-south-4 中国-香港 dws-demo-ap-southeast-1 亚太-新加坡 dws-demo-ap-southeast-3 亚太-曼谷 dws-demo-ap-southeast-2 拉美-圣地亚哥 dws-demo-la-south-2 非洲-约翰内斯堡 dws-demo-af-south-1 拉美-墨西哥城一 dws-demo-na-mexico-1 拉美-墨西哥城二 dws-demo-la-north-2 莫斯科二 dws-demo-ru-northwest-2 拉美-圣保罗一 dws-demo-sa-brazil-1
  • 使用GIN索引全文检索 当使用GIN索引进行全文搜索时,可以使用tsvector和tsquery数据类型以及相关的函数来实现。 要构建一个tsquery对象,需要使用to_tsquery函数,并提供搜索条件和相应的文本搜索配置(在本例中为english)。还可以使用其他文本搜索函数和操作符来进行更复杂的全文搜索查询,例如plainto_tsquery、ts_rank等。具体的用法取决于实际的需求。 创建articles表,其中列content存储了文章的内容。 1 CREATE TABLE articles (id SERIAL PRIMARY KEY,title VARCHAR(100),content TEXT); 插入数据。 1 2 3 4 5 INSERT INTO articles (title, content) VALUES ('Article 1', 'This is the content of article 1.'), ('Article 2', 'Here is the content for article 2.'), ('Article 3', 'This article discusses various topics.'), ('Article 4', 'The content of the fourth article is different.'); 为content列创建一个辅助列tsvector,该列将存储已处理的文本索引。 1 ALTER TABLE articles ADD COLUMN content_vector tsvector; 更新content_vector列的值,将content列的文本转换为tsvector类型。 1 UPDATE articles SET content_vector = to_tsvector('english', content); 创建GIN索引。 1 CREATE INDEX idx_articles_content_gin ON articles USING GIN (content_vector); 执行全文搜索查询,使用tsquery类型来指定搜索条件。例如,查找包含单词“content”的文章: 1 SELECT * FROM articles WHERE content_vector @@ to_tsquery('english', 'content');
  • 应用示例 连接数据库。 具体步骤参见使用命令行工具连接 GaussDB (DWS)集群。 创建表student,有id、name和score三个字段。使用哈希函数加密保存name,使用对称密码算法保存score。 1 2 3 4 5 CREATE TABLE student (id int, name text, score text, subject text); INSERT INTO student VALUES (1, gs_hash('alice', 'sha256'), gs_encrypt('95', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('math', '1234')); INSERT INTO student VALUES (2, gs_hash('bob', 'sha256'), gs_encrypt('92', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('english', '1234')); INSERT INTO student VALUES (3, gs_hash('peter', 'sha256'), gs_encrypt('98', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('science', '1234')); 不使用密钥查询表student,通过查询结果可知:没有密钥的用户即使拥有了SELECT权限也无法看到name和score这两列加密数据。 1 2 3 4 5 6 7 8 9 10 11 12 SELECT * FROM student; id | name | score | subject ----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------- ----------------------------------------------------------------------------------- 1 | 2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1e2gGLr4/ATdCUjTEvova3cb/Ba3ZKqIn1yNVGEFBvJnTq/3sLF4//Gm8qG7AyfNbbqdW3aYErLVpbE/QWFX9Ig== | aFEWQR2gkj iu6sfsAad+dHzfFDHePZ6xd44zyekh+qVFlh9FODZ0DoaFAJXctwUsiqaiitTxW8c CS EaNjS/E7Ke1ruY= 2 | 81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1taXxAoDqE793hgyCJvC0ESdAX5Mtgdq2LXI1f5ZxraQ73WIJVtIBX8oe3gTDxoXGlHbHht4kzM4U8dOwr5rjgg== | aFEWQR2gkj iu6sfsAad+dM8tPTDo/Pds6ZmqdmjGiKxf39+Wzx5NoQ6c8FrzihnRzgc0fycWSu5YGWNOKYWhRsE84Ac= 3 | 026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff | AAAAAAAAAACnyusORPeApqMUgh56ucQu3uso/Llw5MbPFMkOXuspEzhhnc9vErwOFe6cuGtx8muEyHCX7V5yXs+8FxhNh3n5L3419LDWJJLY2O4merHpSg== | zomphRfHV4 H32hTtgkio1PyrobVO8N+hN7kAKwtygKP2E7Aaf1vsjmtLHcL88jyeJNe1lxe0fAvodzPJAxAuV3UJN4M= (3 rows) 使用密钥查询表student,通过查询结果可知:拥有密钥的用户通过使用gs_encrypt对应的解密函数gs_decrypt解密后,可以查看加密数据。 1 2 3 4 5 6 7 SELECT id, gs_decrypt(score, '12345', 'aes128', 'cbc', 'sha256'),gs_decrypt_aes128(subject, '1234') FROM student; id | gs_decrypt | gs_decrypt_aes128 ----+------------+------------------- 1 | 95 | math 2 | 92 | english 3 | 98 | science (3 rows)
  • 技术背景 哈希函数 哈希函数又称为摘要算法,对于数据data,Hash函数会生成固定长度的数据,即Hash(data)=result。这个过程是不可逆的,即Hash函数不存在反函数,无法由result得到data。在不应保存明文场景(比如口令password属于敏感信息),系统管理员用户也不应该知道用户的明文口令,就应该使用哈希算法存储口令的单向哈希值。 实际使用中会加入盐值和迭代次数,避免相同口令生成相同的哈希值,以防止彩虹表攻击。 对称密码算法 对称密码算法使用相同的密钥来加密和解密数据。对称密码算法分为分组密码算法和流密码算法。 分组密码算法将明文分成固定长度的分组,用密钥对每个分组加密。由于分组长度固定,当明文长度不是分组长度的整数倍时,会对明文做填充处理。由于填充的存在,分组密码算法得到的密文长度会大于明文长度。 流加密算法是指加密和解密双方使用相同伪随机加密数据流作为密钥,明文数据依次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。流密码算法不需要填充,得到的密文长度等于明文长度。 图1 对称密码算法
  • 技术实现 GaussDB(DWS)主要提供了哈希函数和对称密码算法来实现对数据列的加解密。哈希函数支持sha256,sha384,sha512和国密sm3。对称密码算法支持aes128,aes192,aes256和国密sm4。 哈希函数 md5(string) 将string使用MD5加密,并以16进制数作为返回值。MD5的安全性较低,不建议使用。 gs_hash(hashstr, hashmethod) 以hashmethod算法对hashstr字符串进行信息摘要,返回信息摘要字符串。支持的hashmethod:sha256,sha384,sha512,sm3。 对称密码算法 gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod) 采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。 gs_decrypt(decryptstr, keystr, cryptotype, cryptomode, hashmethod) 采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。 gs_encrypt_aes128(encryptstr, keystr) 以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为1~16字节。 gs_decrypt_aes128(decryptstr, keystr) 以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。 有关函数的更多内容,请参见使用函数加解密。
  • 场景介绍 GaussDB(DWS)使用对象标识符(oid)来保存对象之间的引用关系,这使得视图在定义的时候就绑定了其依赖的数据库对象的oid,不管视图名称怎么改变,都不会改变这层依赖关系。如果要对基表进行一些字段修改,会因为与视图字段存在强绑定而报错。如果要删除某个表字段或整个表,就需要连同其关联的视图一起使用cascade关键字删除,表字段删除完成或表重建后再依次重建各级视图,给用户的使用增加了很大的工作量,导致易用性较差。 为了解决这一问题,GaussDB(DWS)在8.1.0集群版本实现了视图的解耦,使得存在视图依赖的基表或其他数据库对象(视图、同义词、函数、表字段)可以单独删除,而其对应对象上关联的依赖视图依然存在,而在基表重建后,可以通过ALTER VIEW REBUILD命令重建依赖关系。而8.1.1集群版本在此基础上又实现了自动重建,可以无感知自动重建依赖关系,开启自动重建后会有锁冲突,因此不建议用户开启自动重建。
  • 教程一: IAM 项目视图下的只读操作 创建用户组并授权。 使用华为云账号登录IAM控制台,创建用户组,并授予 数据仓库 服务的只读权限“DWS ReadOnlyAccess”。 创建用户并加入用户组。 在IAM控制台创建用户,并将其加入步骤1中创建的用户组。 用户登录并验证权限。 使用新创建的用户登录控制台,切换至授权区域,验证权限: 在“服务列表”中选择数据仓库服务,进入DWS主界面,单击右上角“创建数据仓库集群”,尝试创建数据仓库集群,如果无法创建(假设当前权限仅包含DWS ReadOnlyAccess),表示“DWS ReadOnlyAccess”已生效。 在“服务列表”中选择除数据仓库服务之外(假设当前策略仅包含DWS ReadOnlyAccess)的任一服务,若提示权限不足,表示“DWS ReadOnlyAccess”已生效。
  • 教程二:企业项目下的只读操作 创建用户组并授权。 使用华为云账号登录IAM控制台,创建用户组,并授予数据仓库服务的只读权限“DWS ReadOnlyAccess”。 企业项目视图下,跟资源无关的只读操作细粒度权限依旧会提示无权限访问。如事件、告警等相关接口的细粒度。 配置IAM项目视图下相关的事件与告警等只读权限。 创建如下自定义策略readonly_event_alarm: { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "dws:alarm*:list*", "dws:cluster*:list*", "dws:dms*:get*", "dws:event*:list*" ] } ] } 登录IAM控制台,创建用户组并授权刚创建的自定义策略: 创建用户并加入用户组。 在IAM控制台创建用户,并将其加入步骤1中创建的用户组。 用户登录并验证权限。 使用新创建的用户登录控制台,切换至授权区域,验证权限: 在“服务列表”中选择数据仓库服务,进入DWS主界面,单击右上角“创建数据仓库集群”,尝试创建数据仓库集群,如果无法创建(假设当前权限仅包含DWS ReadOnlyAccess),表示“DWS ReadOnlyAccess”已生效。 在“服务列表”中选择除数据仓库服务之外(假设当前策略仅包含DWS ReadOnlyAccess)的任一服务,若提示权限不足,表示“DWS ReadOnlyAccess”已生效。
  • 背景信息 如果您需要对华为云上的GaussDB(DWS)资源,为企业中的员工设置不同的访问权限,以达到不同员工之间的权限隔离,您可以使用 统一身份认证 服务(Identity and Access Management,简称IAM)进行精细的权限管理。该服务提供用户身份认证、权限分配、访问控制等功能,可以帮助您安全的控制云资源的访问。通过IAM,您可以在云账号中给员工创建IAM用户,并授权控制他们对云资源的访问范围。 场景一:您的员工中有负责软件开发的人员,您希望他们拥有GaussDB(DWS)的使用权限,但是不希望他们拥有删除集群等高危操作的权限,那么您可以使用IAM为开发人员创建用户,通过授予仅能使用GaussDB(DWS),但是不允许删除集群的权限,控制他们对GaussDB(DWS)资源的使用范围。 场景二:您希望您的员工只有GaussDB(DWS)的资源使用权限,不希望拥有其他云资源的权限,以防止资源滥用。例如只开通GaussDB(DWS)的操作权限,不能使用其他云服务。 通过IAM权限控制,有效达到云资源访问控制,避免云资源误操作。本文将指导如何配置只读权限的IAM用户。
  • 创建GaussDB(DWS)集群 参见创建集群进行创建,区域可选择“华北-北京四”。 确保GaussDB(DWS)集群与 CDM 集群在同一区域,同一个VPC下。 参见使用gsql客户端连接集群连接到集群。 创建迁移前数据检查的目标数据库test01和test02,确保与原MySQL的数据库同名,数据库编码一致。 1 2 create database test01 with encoding 'UTF-8' dbcompatibility 'mysql' template template0; create database test02 with encoding 'UTF-8' dbcompatibility 'mysql' template template0;
  • 场景描述 图1 迁移场景 主要包括云上和云下的MySQL数据迁移,支持整库迁移或者单表迁移,本文以云下MySQL的整库迁移为例。 云下MySQL数据迁移: CDM通过公网IP访问MySQL数据库,CDM与GaussDB(DWS)在同一个VPC下,CDM分别与MySQL和DWS建立JDBC连接。 云上RDS-MySQL数据迁移: RDS、CDM和GaussDB(DWS)均在同一个VPC下,CDM分别与MySQL和DWS建立JDBC连接。如果云上RDS与DWS不在一个VPC,则CDM通过弹性公网IP访问RDS。
  • 迁移后数据一致性验证 使用gsql连接DWS的test01集群。 gsql -d test01 -h 数据库主机IP -p 8000 -U dbadmin -W 数据库用户密码 -r; 查询test01库的表。 1 select * from pg_tables where schemaname= 'public'; 图10 查询test01库的表 查询每个表的数据是否齐全,字段是否完整。 1 2 select count(*) from table name; \d+ table name; 图11 查询表字段 图12 查询表数据 抽样检查,验证表数据是否正确。 1 select * from persons where city = ‘Beijing' order by id_p; 图13 验证表数据 重复执行2~4查看其它库和表数据是否正确。
  • 弹性伸缩应用场景 不同的弹性伸缩功能应用在不同的业务场景下,具体参见表3。 表3 应用场景 分类 弹性伸缩诉求 推荐弹性伸缩方式 业务影响评估 预估耗时评估 存储 存储空间不够, CPU,内存,磁盘IO非瓶颈。 磁盘扩容。 在线。 不涉及数据搬迁,5-10分钟。 存储空间太大,降本 CPU,内存,磁盘IO非瓶颈。 创建同规格小磁盘集群,通过容灾方式把主集群迁移到备集群。 容灾切换过程中集群只读,一般30分钟内。 耗时与数据量正相关。 算力 CPU或内存存在瓶颈。 弹性规格变更。 重启一次集群。 不涉及数据搬迁,5-10分钟。 磁盘IO存在瓶颈。 创建同规格小磁盘集群,通过容灾方式把主集群迁移到备集群。 容灾切换过程中集群只读,一般30分钟内。 耗时与数据量正相关。 分布式算力 & 存储 节点数不足导致分布式能力弱。 集群扩容。 在线(部分限制)。 涉及数据搬迁,耗时和数据量与元数量正相关。 节点数多导致成本高。 集群缩容。 在线(部分限制)。 涉及数据搬迁,耗时和数据量正相关。 拓扑结构 通时修改拓扑和规格诉求(DN数不一致)。 调整集群大小。 只读。 涉及数据搬迁,耗时和数据量与元数量正相关。 通时修改拓扑和规格诉求(DN数一致)。 集群容灾迁移。 在线(部分限制)。 涉及数据搬迁,耗时和数据量正相关。 并发度不够。 增删CN。 在线(部分限制)。 涉及数据搬迁,耗时和元数据量正相关。
  • 集群缩容 相对于集群扩容,集群缩容是分布式MPPDB架构横向收缩的典型场景,通过缩减当前集群部分节点来完成收缩集群规模的能力。集群缩容会同时收缩计算能力和存储能力。 DWS集群物理上由多个ECS节点组合,而为了提升架构可靠性,多个ECS节点(一般3个)又会组成一个逻辑安全环,多个安全环就组成了DWS集群。而缩容则是以安全环为单位缩减,优先缩容集群尾部的安全环。 集群缩容涉及数据搬迁,会把被缩减节点上的数据重分布到剩余节点上,因此缩容耗时与用户的数据库对象数量和数据量正相关。 集群缩容支持GaussDB(DWS)标准数仓、实时数仓,在线缩容在8.1.1.300版本开始支持,在线缩容过程中,DWS服务不重启,持续对外提供服务。表重分布期间用户可以对该表执行插入、更新、删除,但重分布过程仍然会短时间阻塞用户的数据更新操作,会影响用户语句的执行性能。缩容重分布过程会消耗大量的CPU和IO资源,因此会对用户作业性能影响较大,用户应该尽可能在停止业务情况下或业务轻载的情况下执行缩容重分布。 图7 集群缩容
  • 集群调整大小 集群调整大小也叫集群resize,是一个非常全面的功能,它能满足你所有的弹性伸缩需求,它既支持集群规模的Scale out、Scale in,也支持硬件规格的Scale up,Scale down,同时支持集群拓扑结构的重组。 DWS resize基于多nodegroup和数据重分布实现,resize过程中会按照新的资源诉求(硬件升降配)和集群规划(集群规模扩缩)部署一套新集群,然后和老集群做数据重分布,数据迁移完成后,会把业务迁移到新集群,然后释放老集群。 集群resize涉及数据搬迁,会把老集群节点上的数据重分布到新集群节点上(老集群节点上数据还在),因此集群resize耗时与用户的数据库对象数量和数据量正相关。 DWS 标准数仓支持集群resize功能,需agent升级到8.2.0.2版本后支持。目前resize期间老集群只支持只读业务。后续会提供在线能力。 具体操作参见经典变更规格。 图9 集群调整大小